Cod sursa(job #586832)

Utilizator drywaterLazar Vlad drywater Data 2 mai 2011 23:46:32
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <stdio.h>
#include <list>
#include <fstream>
#include <stack>
#define TR( C, it ) \
    for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )
using namespace std;
int n,m,gr[100001],i,ok,luat[100001],sol[600004],x,y,q[100011];
struct nod{int y; nod *next;};
list <int> G[100001];
stack <int> S;
int dfs(int x)
{
    int i=1;
    q[0]=0;
    q[++q[0]]=x;
    while (i<=q[0])
    {
        TR (G[q[i]],it)
        {
        if (!luat[*it])
        {
            luat[*it]=1;
            q[++q[0]]=*it;
        }
        }
        i++;
    }
    return 0;
}
int caut(int v)
{
    while (1)
    {
        if (gr[v]==0) break;
        int w=G[v].front();
        gr[v]--;
        gr[w]--;
        G[v].pop_front();
        TR (G[w],it)
            if (*it==v)
                {G[w].erase(it); break;}
        S.push(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);
        G[x].push_back(y);
        G[y].push_back(x);
        gr[x]++;
        gr[y]++;
    }
    if (!eulerian())
    {
        printf("-1\n");
        return 0;
    }
    int v=1;
    do
    {
        caut(v);
        v=S.top();
        S.pop();
        sol[++sol[0]]=v;
    }while (!S.empty());
    for (i=1;i<=m;i++)
        printf("%d ",sol[i]);
    printf("\n");
    return 0;

}