Cod sursa(job #1359551)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 24 februarie 2015 23:24:57
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include<stdio.h>
#include<algorithm>
#include<stack>
#include<vector>
#define MAXN 100005
#define MAXM 500005
FILE *f=fopen("ciclueuler.in","r"), *g=fopen("ciclueuler.out","w");

using namespace std;

long int N, M, viz[MAXM], nrvecini[MAXN];

    // viz[ i ] = daca a fost luata muchia, i = ind [ ceva ]

vector < pair<int,int> > v[MAXN];   // lista de vecini
//vector <int> ind[MAXN]; // indicii muchiilor
stack <int> ST;        // stiva

void Citire(){
long int i, x, y;

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

        fscanf(f,"%ld %ld\n",&x,&y);
        v[x].push_back( make_pair(y,i) );
        v[y].push_back( make_pair(x,i) );
        nrvecini[x]++; nrvecini[y]++;

    }

}

bool EsteEulerian(){
long int i, j, Q[MAXN], k1, k2, VIZ[MAXN], nod;

    for(i=1;i<=N;i++) if( nrvecini[i] %2 == 1 ) return 0;

    for(i=1;i<=N;i++) VIZ[i]=0;

    k1 = 1; k2 = 1; Q[1]=1; VIZ[1]=1;
    while( k1 <= k2 ){

        nod = Q[k1];
        for(j=0;j<v[nod].size();j++)
            if( VIZ[v[nod][j].first] == 0 ){ Q[++k2] = v[nod][j].first; VIZ[ Q[k2] ]=1; }

        k1++;
    }

    for(i=1;i<=N;i++) if( VIZ[i]==0 ) return 0;

    return 1;

}

void Rezolva(){
long int nod, Afis=0;

    ST.push(1);

    while( !ST.empty() ){

        nod = ST.top();
        if( nrvecini[nod]==0 ){ fprintf(g,"%ld ",nod); ST.pop(); Afis++; if(Afis==M) return; }
        else{

            while( viz [ v[nod][ v[nod].size()-1 ].second ] == 1 ) // Muchie luata
                v[nod].erase( v[nod].end()-1 );

            ST.push( v[nod][ v[nod].size()-1 ].first ); // Pun ultimul vecin

            viz  [ v[nod][ v[nod].size()-1 ].second ]=1;
            nrvecini[nod]--; nrvecini[ v[nod][ v[nod].size()-1 ].first ]--; // Sterg din nrvecini

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

        }

    }

}

int main(){

    Citire();
    if( !EsteEulerian() ) fprintf(g,"-1\n");
    else
        Rezolva();

    fclose(f); fclose(g);

return 0;
}