Cod sursa(job #373458)

Utilizator cristikIvan Cristian cristik Data 13 decembrie 2009 20:42:48
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#define max 100010
struct lista
{
    int nod;
    lista *next;
};
lista *g[max];
int n,m,i,j,k,top,stack[5*max],deg[max];
void erase(int v,int w)
{
    lista *p,*q,*r;
    q=g[v];
    g[v]=g[v]->next;
    delete q;

    if(g[w]->nod==v)
    {
        p=g[w];
        g[w]=g[w]->next;
        delete p;
    }
    else
    {
        for(r=g[w]; r->next; r=r->next)
         if(r->next->nod==v)
         {
             p=r->next;
             r->next=r->next->next;
             delete p;
             break;
         }
    }
}
void euler(int v)
{
    int w;
    stack[++top]=v;
    while(top)
    {
        w=stack[top];
        if(g[w]!=NULL)
        {
            stack[++top]=g[w]->nod;
            erase(w,g[w]->nod);
        }
        else printf("%d ",stack[top--]);

    }
}
void push(int i,int j)
{
    lista *p=new lista;
    p->nod=j;
    p->next=g[i];
    g[i]=p;
}
int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(; m>0; m--)
    {
        scanf("%d%d",&i,&j);
        push(i,j);
        push(j,i);
        deg[i]++; deg[j]++;
    }
    for(i=1; i<=n; i++)
     if(deg[i]%2==1) { printf("-1"); return 0; }
    euler(1);
    return 0;
}