Cod sursa(job #1509648)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 24 octombrie 2015 10:30:06
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 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, viz[MAXN], OK;
int ST[MAXM], hST, Ciclu[MAXM], hCiclu = 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 DF(  int NODst ){
int Q[MAXN], NOD, NODnou, st, fn, i;

    st= 1;
    fn = 1;
    viz[NODst] = 1;
    Q[1] = NODst;

    while( st <= fn ){

        NOD = Q[st];
        for(i=0;i<v[NOD].size();i++)
        {
            NODnou = v[NOD][i];
            if( viz[ NODnou ] == 0 ){
                viz[ NODnou ] = 1;
                Q[++fn] = NODnou;
            }
        }
        st++;

    }

}

int Verificare(){
int i;

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

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

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

    return 1;

}

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

    ST[1] = 1;
    hST = 1;

    while( hST > 0 ){

        NOD = ST[ hST ];

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

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

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

            ST[++hST] = NODnou;

        }

        else{

            Ciclu[ ++hCiclu ] = NOD;
            hST--;

        }

    }

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

}

int main(){

    Citire();

    OK = Verificare();  // -1 - nu este   1 - este
    if( OK == -1 ){ fprintf(g,"-1\n"); return 0; }

    CicluEuler();

return 0;
}