Cod sursa(job #1622487)

Utilizator AndyCatrunaCatruna Andy AndyCatruna Data 1 martie 2016 11:51:33
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>
#define dim 500005
#define x first
#define y second
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n,i,j,m,grad[dim],viz[dim],Start,Last,nod,a,b,ok;
vector<pair<int,int> > v[dim];
vector <int> sol;
stack <int> st;
void dfs(int nod){
    viz[nod]=1;
    for(int i = 0 ; i<v[nod].size();i++){
        int vecin  = v[nod][i].x;
        if(viz[vecin]==0){
            dfs(vecin);
        }
    }
}
int main(){
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>a>>b;
        v[a].push_back(make_pair(b,i));
        v[b].push_back(make_pair(a,i));
        grad[a]++;grad[b]++;
    }
    for(i=1;i<=n;i++){
        if(grad[i]!=0){
            dfs(i);
            Start=i;
            break;
        }
    }
    for(i=1;i<=n;i++){
        if(grad[i]%2==1 || viz[i]==0){
            fout<<-1<<"\n";
            return 0;
        }
        viz[i]=0;
    }
    st.push(Start);
    ok=1;
    while(!st.empty()){
        nod = st.top();
        if(grad[nod]==0){
            sol.push_back(nod);
            st.pop();
        }
        else{
            Last = v[nod].size()-1;
            while(viz[v[nod][Last].y]==1){
                v[nod].erase(v[nod].end()-1);
                Last = v[nod].size()-1;

            }
            viz[v[nod][Last].y]=1;
            grad[nod]--;
            grad[v[nod][Last].x]--;
            st.push(v[nod][Last].x);
            v[nod].erase(v[nod].end()-1);

        }
    }
    for(i=0;i<sol.size()-1;i++){
        fout<<sol[i]<<" ";
    }

    return 0;
}