Cod sursa(job #586814)

Utilizator drywaterLazar Vlad drywater Data 2 mai 2011 22:55:39
Problema Ciclu Eulerian Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <stdio.h>
int n,m,gr[100001],i,ok,luat[100001],sol[600004],x,y,q[100011];
struct nod{int y; nod *next;};
nod *G[100001];
void add(int x,int y)
{
    nod *nou=new nod;
    nou->y=y;
    nou->next=G[x];
    G[x]=nou;
}
int dfs(int x)
{
    int i=1;
    q[0]=0;
    q[++q[0]]=x;
    while (i<=q[0])
    {
        nod *nou=new nod;
        nou=G[q[i]];
        while (nou)
        {
        if (!luat[nou->y])
        {
            luat[nou->y]=1;
            q[++q[0]]=nou->y;
        }
        nou=nou->next;
        }
        i++;
    }
    return 0;
}
int caut(int v)
{
    while (1)
    {
        nod *nou=new nod;
        if (gr[v]==0) break;
        int w=G[v]->y;
        gr[v]--;
        gr[w]--;
        if (gr[v])
            G[v]=G[v]->next;
        else G[v]=NULL;
        if (G[w]->y==v)
        {
            nou=G[w];
            if (gr[w])
            G[w]=G[w]->next;
            else G[w]=NULL;
            delete nou;
        }
        else
        {
        nou=G[w]->next;
        nod *pre=new nod;
        pre=G[w];
        while (nou->y!=v)
        {
            pre=pre->next;
            nou=nou->next;
        }
        pre->next=nou->next;
        delete nou;
        }
        sol[++sol[0]]=v;
        v=w;
    }
    return 0;
}
int eulerian()
{
    for (i=1;i<=n;i++)
        if (gr[i]%2==1) return 0;
    luat[1]=1;
    dfs(1);
    for (i=1;i<=n && ok;i++)
        if (!luat[i])
            return 0;
    return 1;

}
int main(void)
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
        gr[x]++;
        gr[y]++;
    }
    if (!eulerian())
    {
        printf("-1\n");
        return 0;
    }
    caut(1);
    for (i=1;i<=m;i++)
        printf("%d ",sol[i]);
    printf("\n");
    return 0;

}