Cod sursa(job #1200876)

Utilizator heracleRadu Muntean heracle Data 23 iunie 2014 19:15:41
Problema Ciclu Eulerian Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <cstdio>

FILE* in=fopen("ciclueuler.in","r");
FILE* out=fopen("ciclueuler.out","w");

int nod,muc;

const int Q=500001,W=100001;

struct muchie
{
    int x,y;
    bool f;
} v[Q];

int urm[Q],lst[W],nr,val[W];

void inline add(int i)
{
    nr++;
    val[nr]=i;
    urm[nr]=lst[v[i].x];
    lst[v[i].x]=nr;

    nr++;
    val[nr]=i;
    urm[nr]=lst[v[i].y];
    lst[v[i].y]=nr;
}


int rez[Q],h;

void inline euler(int act)
{
    int p,m;
    p=lst[act];

    while(p!=0)
    {
        m=val[p];
        if(v[m].f==0)
        {
            v[m].f=1;


            if(v[m].x==act)
            {
                euler(v[m].y);
            }
            else
            {
                euler(v[m].x);
            }
        }
        p=urm[p];
    }
    rez[++h]=act;
}

/*
void inline make(int act)
{
    int m;

    while(lst[act]!=0)
    {
        m=val[lst[act]];

        lst[act]=urm[lst[act]];

        while(v[m].f==1)
        {
            m=val[lst[act]];
            lst[act]=urm[lst[act]];
        }
        if(m==0)
            break;


        v[m].f=1;
        viz++;

        if(v[m].x==act)
        {
            fprintf(out,"%d ",v[m].y);
            act=v[m].y;
        }
        else
        {
            fprintf(out,"%d ",v[m].x);
            act=v[m].x;
        }


    }
}
*/

int numar[Q*2];

int main()
{
    fscanf(in,"%d%d",&nod,&muc);

    int a,b;

    for(int i=1; i<=muc; i++)
    {
        fscanf(in,"%d%d",&v[i].x,&v[i].y);
        numar[v[i].x]++;
        numar[v[i].y]++;
        add(i);
    }


    int p;
    for(int i=1; i<=nod; i++)
    {

        if(numar[i]%2==1)
        {
            fprintf(out,"-1");
                return 0;
        }
    }
    euler(1);
    /*
        p=lst[i];
        while(p!=0)
        {
            if(v[val[p]].f==0)
            {
                fprintf(out,"-1");
                return 0;
            }
            p=urm[p];
        }
        */

    for(int i=1; i<=h; i++)
    {
        fprintf(out,"%d ",rez[i]);
    }



    return 0;
}