Cod sursa(job #394884)

Utilizator hasegandaniHasegan Daniel hasegandani Data 11 februarie 2010 19:25:21
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include<stdio.h>

#define Nmax 250010

struct nod
{
    int drum;
    nod *urm;
} *l[Nmax];

int ct,nr[Nmax],n;
int st[Nmax],vf;

void sterge(nod *&inc,int info)
{
    nod *q;
    if (inc->drum==info)
        {
            q=inc;
            inc=inc->urm;
            delete q;
        }
    else
        for(nod *t=inc ; t->urm ; t=t->urm)
            if ((t->urm)->drum==info)
                {
                q=t->urm;
                t->urm=t->urm->urm;
                delete q;
                return ;
                }
}

void euler()
{
    int nod;
    st[++vf]=1;
    
    while (vf)
        {
            nod=st[vf];
            if (l[ nod ])
                {
                st[++vf]=l[nod]->drum;
                
                l[nod] = l[nod]->urm;
                sterge(l[st[vf]],nod);
                }
            else
                {
                if (vf>1)
                    printf("%d ",st[vf]);
                --vf;
                }
        }
}

int right()
{
    for(int i=1;i<=n;++i)
        if (nr[i]%2==1)
            return 0;
    return 1;
}

void solve()
{
    if (right())
        euler();
    else
        printf("-1");
    printf("\n");
}

void add(nod *&inc,int info)
{
    nod *p=new nod;
    p->drum=info;
    p->urm=inc;
    inc=p;
}

void cit()
{
    int a,b,m;
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(;m;--m)
        {
        scanf("%d%d",&a,&b);
        add(l[a],b);
        add(l[b],a);
        nr[a]++;
        nr[b]++;
        }
}

int main()
{
    cit();
    solve();
    
    return 0;
}