Cod sursa(job #1687443)

Utilizator IgorDodonIgor Dodon IgorDodon Data 12 aprilie 2016 21:10:19
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define DIM 100005
FILE *f=fopen("ciclueuler.in","r"), *g=fopen("ciclueuler.out","w");

using namespace std;

vector <int> v[DIM];

int N, M, Eulerian = 1, SOL[DIM], lSOL = 0, Q[5*DIM], hST, ST[5*DIM];
bool viz[DIM];

void Citire(){
int i, x, y, NOD, NODnou, p, u;

    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);

    }

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

    p = u = 1;
    Q[1] = 1;
    viz[1] = 1;

    while( p <= u ){

        NOD = Q[p];

        for(i=0;i<v[NOD].size();i++){

            NODnou = v[NOD][i];

            if( viz[ NODnou ] == 0 ){
                Q[++u] = NODnou;
                viz[ NODnou ] = 1;
            }

        }

        p ++;

    }

    for(i=1;i<=N;i++)
        if( viz[i] == 0 ){
            Eulerian = 0;
            return;
        }

}

void Rezolvare(){
int i, NOD, NODnou;

    hST = 1;
    ST[1] = 1;

    while( hST > 0 ){

        NOD = ST[hST];

        if( v[NOD].size() == 0 ){

            SOL[++lSOL] = NOD;
            hST --;

        }

        else{

            NODnou = v[NOD][ v[NOD].size()-1 ];
            ST[++hST] = NODnou;

            v[NOD].pop_back();
            v[NODnou].erase( find( v[NODnou].begin(), v[NODnou].end(), NOD ) );

        }

    }

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

}

int main(){

    Citire();

    if( !Eulerian )
        fprintf(g,"-1\n");

    else
        Rezolvare();


return 0;
}