Cod sursa(job #1967288)

Utilizator tudi98Cozma Tudor tudi98 Data 16 aprilie 2017 13:21:55
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
using namespace std;

#define REP(i,a) for (int i = 0; i < a; i++)
#define FOR(i,a,b) for (int i = a; i <= b; i++)
#define ROF(i,a,b) for (int i = a; i >= b; i--)
#define FOREACH(it,x) for (auto it: (x))
#define pb push_back
#define mp make_pair
#define SZ(x) ((int)(x).size())

int n,m;
vector<int> G[100001];
vector<int> Sol;
bool seen[100001];
int grad[100001];

void dfs(int node)
{
    seen[node] = 1;
    FOREACH(it,G[node]) if (!seen[it]) dfs(it);
}

int main()
{
    ifstream fin("ciclueuler.in");
    ofstream fout("ciclueuler.out");

    fin >> n >> m;
    while (m--) {
        int x,y;
        fin >> x >> y;
        G[x].pb(y);
        grad[x]++,grad[y]++;
        G[y].pb(x);
    }

    int comp = 0;
    FOR(i,1,n) {
        if (!seen[i]) dfs(i), comp++;
        if (grad[i] % 2 != 0) comp = 2;
        if (comp > 1) break;
    }

    if (comp > 1) {
        fout << "-1";
        return 0;
    }

    stack<int> S; S.push(1);
    while (!S.empty())
    {
        int u = S.top();
        if (SZ(G[u]))
        {
            int v = G[u].back(); G[u].pop_back();
            FOR(i,0,SZ(G[v])-1) if (G[v][i] == u) {
                G[v].erase(G[v].begin()+i);
                break;
            }
            S.push(v);
            continue;
        }
        Sol.pb(u);
        S.pop();
    }

    Sol.pop_back();
    FOREACH(it,Sol) fout << it << " ";
}