Cod sursa(job #1412823)

Utilizator IgorDodonIgor Dodon IgorDodon Data 1 aprilie 2015 16:17:10
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
#define DIMN 100005
#define DIMM 500005
FILE *f=fopen("ciclueuler.in","r"), *g=fopen("ciclueuler.out","w");

using namespace std;

vector < pair<int,int> > v[DIMN];

int N, M, viz[DIMM], ST[DIMN], HST;

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( make_pair(y,i) );
        v[y].push_back( make_pair(x,i) );
    }

}

bool Componente(){
int viz[DIMN], Q[DIMN], p, u, i, nod;

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

    while( p <= u ){

        nod = Q[p];
        for(i=0;i<v[nod].size();i++)
            if( viz[ v[nod][i].first ] == 0 ){

                viz[ v[nod][i].first ] =  1;
                Q[++u] = v[nod][i].first;

            }

        p++;
    }

    if( u == N )
        return 1;
    else
        return 0;

}

bool Paritate(){

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

    return 1;
}

void Euler(){
int i, nod, nodnou;

    HST = 1;
    ST[1] = 1;

    while( HST >= 1 ){

        nod = ST[HST];

        while(1){

            if( v[nod].size() == 0 )
                break;
            if( viz[ v[nod][ v[nod].size() - 1 ].second ] == 0 )
                break;

            v[nod].erase( v[nod].end() - 1 );

        }

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

            fprintf(g,"%d ",nod);
            HST --;

        }

        else{

            ST[++HST] = v[nod][ v[nod].size() - 1 ].first;
            viz[ v[nod][ v[nod].size() - 1 ].second ] = 1;

        }

    }

}

int main(){

    Citire();

    if( Componente() == 0 || Paritate() == 0 )
        fprintf(g,"-1\n");

    else
        Euler();

return 0;
}
// ASTA