Cod sursa(job #2722737)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 13 martie 2021 11:36:39
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>

const int MAXN = 1e5 + 1,MAXM = 5e5 + 1;

using namespace std;

ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");

vector<int>graf[MAXN];
bool viz[MAXM];
int n,m,from[MAXN],to[MAXM];
vector<int>ans;

int main()
{
    in>>n>>m;
    for(int i = 1; i <= m; i++){
        int x,y;
        in>>x>>y;
        graf[x].push_back(i);
        graf[y].push_back(i);
        from[i] = x;
        to[i] = y;
    }
    for(int i = 1; i <= n; i++){
        if(graf[i].size() & 1){
            out<<-1;
            return 0;
        }
    }
    stack<int>stiva;
    stiva.push(1);
    while(stiva.size()){
        int nod = stiva.top();
        bool are_liber = false;
        for(auto label : graf[nod]){
            /// am label-ul muchiilor
            if(!viz[label]){
                are_liber = true;
                int vecin;
                if(nod == from[label])
                    vecin = to[label];
                else
                    vecin = from[label];
                viz[label] = true;
                stiva.push(vecin);
                break;
            }
        }
        if(!are_liber){
            /// m-am blocat undeva
            ans.push_back(nod);
            stiva.pop();
        }
    }
    for(int i = 1; i <= m; i++){
        if(!viz[i]){
            out<<-1;
            return 0;
        }
    }
    for(int i = 0; i < ans.size() - 1; i++)
        out<<ans[i]<<" ";
    return 0;
}