Cod sursa(job #1291052)

Utilizator HDT_TibiHudema Dumitru Tiberiu HDT_Tibi Data 12 decembrie 2014 09:20:18
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 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)
{
    for(nod q=lista;q;q=q->leg)fout<<q->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]){sterge(stiva,stiva->inf);add(rezultat,pct);}
        else{
            int x=L[pct]->inf;
            sterge(L[pct],x);
            sterge(L[x],pct);
            add(stiva,x);

        }
    }
}
int main()
{
    citire();
    if( !verificare() ) fout<<"-1"<<endl;
    else {
        euler();
        sterge(rezultat,rezultat->inf);
        afisare(rezultat);}
    return 0;
}