Cod sursa(job #1243494)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 15 octombrie 2014 22:59:38
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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

stack<int>s;

vector < pair<int,int> > l[100010];

bool f[100010],ff[500010];

int n,m,x,y,i,ok,d[100010];

void dfs (int nod) {
    f[nod]=1;
    for (int i=0;i<l[nod].size();i++)
        if (!f[l[nod][i].first])
            dfs(l[nod][i].first);
}

int main () {

    fin>>n>>m;
    for (i=1;i<=m;i++) {
        fin>>x>>y;
        l[y].push_back(make_pair(x,i));
        l[x].push_back(make_pair(y,i));
        d[x]++;
        d[y]++;
    }

    for (i=1;i<=n;i++)
        if (d[i]==0)
            f[i]=1;
        else
            if (ok==0 && !f[i]) {
                dfs(i);
                ok=i;
            }
    for (i=1;i<=n;i++)
        if (!f[i]||(d[i]%2)){
            fout<<"-1\n";
            return 0;
        }
    s.push(ok);
    ok=1;
    while (!s.empty()){
        x=s.top();
        if (l[x].empty()) {
            if (!ok)
                fout<<x<<" ";
            ok=0;
            s.pop();
            continue;
        }
        if (ff[l[x][ l[x].size()-1 ].second])
            l[x].pop_back();
        else {
            s.push(l[x][ l[x].size()-1 ].first);
            ff[l[x][ l[x].size()-1 ].second]=1;
            l[x].pop_back();
        }
    }

    return 0;
}