Cod sursa(job #2988034)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 3 martie 2023 14:54:57
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <vector>
#include <stack>
using namespace std;

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

const int MAX = 1e5 + 1;

vector <int> g[MAX];

int n , x , y , m , last[MAX] , t[MAX];

bool marcat[MAX];

vector <int> ans;

void read(){

    cin >> n >> m;

    while(m--){

        cin >> x >> y;

        g[x].push_back(y);
        g[y].push_back(x);
    }
}

void dfs( int x ){

    marcat[x] = 1;

    for(auto it : g[x]){

        if(!marcat[it]) dfs(it);
    }
}

void check(){

    for(int i = 1 ; i <= n ; i++){

        if(g[i].size()){

            dfs(i);

            break;
        }
    }

    for(int i = 1 ; i <= n ; i++){

        if(g[i].size()%2){

            cout << -1;

            exit(0);
        }

        if(!g[i].size()) continue;

        if(!marcat[i]){

            cout << -1;

            exit(0);
        }
    }
}

void euler(){

    stack <int> s;

    s.push(1);

    while(!s.empty()){

        x = s.top();

        int sz = g[x].size();

        bool ok = 0 , muchie_tata = 0;

        for(int i = last[x] ; i < sz ; i++){

            last[x]++;

            int it = g[x][i];

            if(it == t[x]){

                if(!muchie_tata){

                    muchie_tata = 1;

                    continue;

                }
            }

            t[it] = x;

            s.push(it);

            ok = 1;

            break;
        }

        if(ok) continue;

        ans.push_back(x);

        s.pop();
    }
}

void afis(){

    for(auto it : ans){

        cout << it << ' ';
    }

}

int main()
{

    read();
    check();
    euler();
    afis();

    return 0;
}