Cod sursa(job #1650614)

Utilizator IgorDodonIgor Dodon IgorDodon Data 11 martie 2016 19:23:44
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
#define MAXN 100005
#define MAXM 500005
FILE *f=fopen("ciclueuler.in","r"), *g=fopen("ciclueuler.out","w");

using namespace std;

vector <int> v[MAXN];

int N, M, ST[MAXM], hST, viz[MAXM], SOL[MAXM], lSOL = 0;

void Citire(){
int i, X, Y;

    fscanf(f,"%d %d\n",&N,&M);
    for(i=1;i<=M;i++){

        fscanf(f,"%d %d\n",&X,&Y);
        v[X].push_back(Y);
        v[Y].push_back(X);

    }

}

void DFS( int start ){
int i, nod, NEWnod, Q[MAXN], st, fn;

    st = 1;
    fn = 0;
    Q[++fn] = start;
    viz[ start ] = 1;

    while( st <= fn ){

        nod = Q[st];
        for(i=0;i<v[nod].size();i++){

            NEWnod = v[nod][i];

            if( viz[NEWnod] == 0 ){

                Q[++fn] = NEWnod;
                viz[NEWnod] = 1;

            }

        }
        st++;

    }

}

bool Verif(){
int i;

    for(i=1;i<=N;i++)
        if( v[i].size() %2 != 0 )
            return 0;

    DFS(1);
    for(i=1;i<=N;i++)
        if( viz[i] != 1 )
            return 0;

    return 1;
}

void Rezolvare(){
int i, nod, NEWnod;

    hST = 0;
    ST[++hST] = 1;

    while( hST > 0 ){

        nod = ST[hST];
        if( v[nod].size() > 0 ){

            NEWnod = v[nod][ v[nod].size()-1 ];
            ST[++hST] = NEWnod;

            v[nod].pop_back();
            v[NEWnod].erase( find( v[NEWnod].begin(), v[NEWnod].end(), nod ) );

        }
        else
            {SOL[++lSOL] = nod;
            hST--;}

    }

    for(i=1;i<=lSOL-1;i++)
        fprintf(g,"%d ",SOL[i]);

}

int main(){

    Citire();
    if( Verif() == 0 ){ fprintf(g,"-1\n"); return 0; }
    Rezolvare();

return 0;
}