Cod sursa(job #1621881)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 29 februarie 2016 22:32:29
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
vector< pair< int , int > >L[500100];
stack<int>q;
int n,m,a,b,c,i,p,ok,j,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 ] == 0 )
            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[b] ++ ;
        x[a] ++ ;
    }
    for(i=1;i<=n;i++){
        if( x[i] ){
            dfs(i);
            p=i;
            break;
        }
    }
    for(i=1;i<=n;i++){
        if( v[i] == 0 || x[i] % 2 == 1 ){
            fprintf(g,"-1");
            return 0;
        }
        v[i] = 0;
    }
    q.push(p);
    ok = 1;
    while( !q.empty() ){
        a = q.top();
        if( x[a] == 0 ){
            q.pop();
            if( !ok )
                fprintf(g,"%d ",a);
            ok = 0;
        }
        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;
            q.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;
}