Cod sursa(job #1497830)

Utilizator andi12Draghici Andrei andi12 Data 7 octombrie 2015 15:54:23
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>

using namespace std;
const int N=100005;
const int M=500005;
struct eul
{
int x,y;
};
eul v[2*M];
int e[2*M],lst[N],urm[2*M],c[M],par[N];
bool folosit[M],marcat[N];
int nr,i,y,rc,n,m;
void ad(int i)
{
    e[++nr]=i;
    urm[nr]=lst[v[i].x];
    lst[v[i].x]=nr;
    e[++nr]=i;
    urm[nr]=lst[v[i].y];
    lst[v[i].y]=nr;
}
int celalalt(int i,int x)
{
    if(v[i].x==x)
        return v[i].y;
    else
        return v[i].x;
}
void eul(int x)
{
    int p;
    p=lst[x];
    while(p!=0)
    {
        i=e[p];
        y=celalalt(i,x);
        if(!folosit[i])
        {
            folosit[i]=true;
            eul(y);
        }
        p=urm[p];
    }
    c[++rc]=x;
}
int main()
{
    FILE *in,*out;
    in=fopen("ciclueuler.in","r");
    out=fopen("ciclueuler.out","w");
    int i,x,y,ok=0;
    fscanf(in,"%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        fscanf(in,"%d%d",&v[i].x,&v[i].y);
        par[v[i].x]++;
        par[v[i].y]++;
    }
    for(i=1;i<=n;i++)
        if(par[i]%2==1)
            ok=1;
    for(i=1;i<=m;i++)
        ad(i);
    eul(1);
    for(i=1;i<=rc;i++)
    {
        marcat[c[i]]=1;
    }
    for(i=1;i<=n;i++)
    {
        if(marcat[i]==0)
            ok=1;
    }
    if(ok==1)
        fprintf(out,"-1");
    else
    {
        for(i=1;i<=rc-1;i++)
            fprintf(out,"%d ",c[i]);
    }
    return 0;
}