Cod sursa(job #610187)

Utilizator proflaurianPanaete Adrian proflaurian Data 25 august 2011 15:13:25
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<cstdio>
#include<vector>
#include<deque>
using namespace std;
int n,m,i,x,y,e,g[100001],a[1000001],b[1000001],u[1000001],st[2000001],top;
vector<int> v[100001];
deque<int> Q;
int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){scanf("%d%d",&a[i],&b[i]);v[a[i]].push_back(i);v[b[i]].push_back(i);g[a[i]]++;g[b[i]]++;}
    for(i=1;i<=n;i++)if(g[i]&1){printf("-1\n");return 0;}
    x=n;Q.push_back(1);x--;st[1]=1;
    for(;Q.size()&&x;)
    {
        y=Q.front();
        for(vector<int>::iterator it=v[y].begin();it!=v[y].end();it++)
            if(!st[a[*it]+b[*it]-y])
            {
                Q.push_back(a[*it]+b[*it]-y);
                x--;
                st[a[*it]+b[*it]-y]=1;
            }
        Q.pop_front();
    }
    if(x){printf("-1\n");return 0;}
    top=1;st[top]=1;
    for(;top>1||m;)
    {
        x=st[top];
        if(!g[x]){printf("%d ",st[top]);top--;m--;continue;}
        if(u[v[x].back()]){v[x].pop_back();continue;}
        e=v[x].back();u[e]=1;y=a[e]+b[e]-x;g[x]--;g[y]--;st[++top]=y;
    }
    return 0;
}