Cod sursa(job #1291051)

Utilizator HDT_TibiHudema Dumitru Tiberiu HDT_Tibi Data 12 decembrie 2014 09:17:24
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

struct Nod{int inf; Nod*leg;}*L[100001],*stiva,*rezultat;
typedef Nod* nod;
int grad[100001],n,m;

void add(nod &lista, int x){
    nod p=new Nod;
    p->inf=x;
    p->leg=lista;
    lista=p;
}

void sterge(nod &lista,int x)
{
    nod pred=lista;
    if(lista->inf==x){lista=lista->leg;delete pred;return;}
    else{
        for(nod q=lista->leg;q;q=q->leg){
                if(q->inf==x){
                    pred->leg=q->leg;
                    delete q;
                    return;
                }
                pred=q;
        }
    }
}

void citire()
{
    int x,y;
    fin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        fin>>x>>y;
        add(L[x],y);
        add(L[y],x);
        grad[x]++;
        grad[y]++;
    }
}

void afisare(nod lista)
{
    if(!lista)return;
    else{afisare(lista->leg);fout<<lista->inf<<" ";}
}

bool verificare(){for(int i=1; i<=n; i++)if(grad[i]%2!=0)return 0; return 1;}

void euler(){
    add(stiva,1);
    while(stiva)
    {
        int pct=stiva->inf;
        if(!L[pct]){add(rezultat,pct);sterge(stiva,stiva->inf);}
        else{
            int x=L[pct]->inf;
            add(stiva,x);
            sterge(L[pct],x);
            sterge(L[x],pct);
        }
    }
}
int main()
{
    citire();
    if( !verificare() ) fout<<"-1"<<endl;
    else {
        euler();
        sterge(rezultat,rezultat->inf);
        afisare(rezultat);}
    return 0;
}