Cod sursa(job #278549)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 12 martie 2009 13:16:22
Problema Ciclu Eulerian Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>

using namespace std;

struct nod
{
    nod *next;
    int val,nr;
}*a[100005];

int n,m,grad[100005],r=-1,viz[500005];

void add(int x, int y)
{
    nod *p;
    p=new nod;
    p->val=y;
    p->next=a[x];
    p->nr=r;
    a[x]=p;
}

void citire()
{
    freopen("ciclueuler.in","r",stdin);
    scanf("%d%d", &n, &m);
    int x,y;
    for (int i=1; i<=n; i++)
    {
        a[i]=new nod;
        a[i]=NULL;
    }
    for (int i=0; i<m; i++)
    {
        scanf("%d%d", &x, &y);
        ++r;
        add(x,y);
        grad[x]++;
        grad[y]++;
        if (x!=y)
            add(y,x);
    }
}

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

void euler(int w)
{
    //while (a[w])
    for (int i=1; i<m; i++)
    {
        while (viz[a[w]->nr])
            a[w]=a[w]->next;
        viz[a[w]->nr]=1;
        printf("%d ",a[w]->val);
        int x=a[w]->val;
        a[w]=a[w]->next;
        w=x;
    }
}

int main()
{
    freopen("ciclueuler.out","w",stdout);
    citire();
    if (!verificare())
        printf("-1\n");
    else
    {
        printf("1 ");
        euler(1);
    }
    return 0;
}