Cod sursa(job #1679759)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 8 aprilie 2016 10:55:40
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
vector< pair< int ,int  > >L[500100];
stack<int>S;
int n,m,i,j,a,b,c,p,ok,v[500100],x[500100];
FILE *f,*g;
void dfs(int nod){
    v[nod] = 1;
    for(int i=0;i<L[nod].size();i++){
        if( !v[ L[nod][i].first ] )
            dfs( L[nod][i].first );
    }
}
int main(){
    f=fopen("ciclueuler.in","r");
    g=fopen("ciclueuler.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d",&a,&b);
        L[a].push_back( make_pair( b , i ) );
        L[b].push_back( make_pair( a , i ) );
        x[a] ++;
        x[b] ++;
    }
    for(i=1;i<=n;i++){
        if( x[i] ){
            dfs(i);
            p = i;
            break;
        }
    }
    for(i=1;i<=n;i++){
        if( x[i] % 2 || !v[i] ){
            fprintf(g,"-1");
            return 0;
        }
    }
    for(i=1;i<=n;i++){
        v[i] = 0;
    }
    S.push(p);
    while( !S.empty() ){
        a = S.top();
        if( x[a] == 0 ){
             S.pop();
             if( ok )
                fprintf(g,"%d ",a);
             ok = 1;
        }
        else{
            while( v[ L[a][ L[a].size() - 1 ].second ] == 1 ){
                L[a].erase( L[a].end() - 1 );
            }
            v[ L[a][ L[a].size() - 1 ].second ] = 1;
            S.push( L[a][ L[a].size() - 1 ].first );
            x[a]--;
            x[ L[a][ L[a].size() - 1 ].first ]--;
            L[a].erase( L[a].end() - 1 );
        }
    }



    fclose(f);
    fclose(g);
    return 0;
}