Cod sursa(job #1232689)

Utilizator t.g.g.tt.g.g.t t.g.g.t Data 23 septembrie 2014 18:03:07
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <cstdio>

using namespace std;

struct cel
{
    int urm,inf;
    cel *adr;
};

typedef cel *lda1;

lda1 lda[100005];

int n,m,a,b,sol[500005],lista[500005],grad[100005],trecut[100005],scos[500005];

void parc(int nod)
{
    trecut[nod]=1;
    for (lda1 p=lda[nod];p!=0;p=p->adr)
    {
        if (trecut[p->urm]==0)
        {
            parc(p->urm);
        }
    }
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);

    scanf("%d %d",&n,&m);

    for (int i=1;i<=m;++i)
    {
        scanf("%d %d",&a,&b);
        grad[a]++; grad[b]++;
        lda1 p=new cel;
        p->urm=b;
        p->inf=i;
        p->adr=lda[a];
        lda[a]=p;
        p=new cel;
        p->urm=a;
        p->inf=i;
        p->adr=lda[b];
        lda[b]=p;
    }

    int advr=1;
    parc(1);
    for (int i=1;i<=n;++i) if (trecut[i]==0) advr=0;
    for (int i=1;i<=n;++i) if (grad[i]&1==1) advr=0;

    if (advr==1)
    {
        lista[0]=1; lista[1]=1;
        while (lista[0]>0)
        {
            int i=lista[lista[0]];
            if (grad[i]==0)
            {
                ++sol[0]; sol[sol[0]]=i; --lista[0];
            }else
            {

                while (scos[lda[i]->inf]==1)
                {
                    lda1 p=lda[i];
                    lda[i]=lda[i]->adr;
                    delete(p);
                }

                ++lista[0]; lista[lista[0]]=lda[i]->urm;
                --grad[i];
                --grad[lda[i]->urm];
                scos[lda[i]->inf]=1;
                lda1 p=lda[i];
                lda[i]=lda[i]->adr;
                delete(p);
            }
        }
        for (int i=1;i<=m;++i) printf("%d ",sol[i]);
    }else printf("-1");

    fclose(stdin);
    fclose(stdout);
    return 0;
}