Cod sursa(job #632137)

Utilizator Sm3USmeu Rares Sm3U Data 10 noiembrie 2011 14:00:32
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include <stdio.h>
#define nMax 100100
using namespace std;

int n;
int m;
int grad[nMax];
struct nod{
    int x;
    nod *urm;
}*a[nMax];
int sol[nMax];
int solMare[nMax];
int nSol;
int nSolMare;

void citire()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
    {
        int x;
        int y;
        scanf("%d%d",&x,&y);
        grad[x]++;
        grad[y]++;
        nod *g;
        g = new nod;
        g -> x = x;
        g -> urm = a[y];
        a[y] = g;
        nod *h;
        h = new nod;
        h -> x = y;
        h -> urm = a[x];
    }
}

void funct()
{
    if(!nSolMare)
    {
        for(int i=0;i<nSol;i++)
            solMare[i]=sol[i];
        nSolMare=nSol;
        nSol=0;
        return;
    }
    for(int i=0;i<n;i++)
    {
        if(solMare[i]==sol[0])
        {
            for(int j=nSol-1;j>i;j--)
                solMare[j]=solMare[j-nSol+1];
            for(int k=1;k<nSol;k++,i++)
            {
                solMare[i]=sol[k];
            }
            nSolMare=nSol;
            nSol=0;
            return;
        }
    }
}

void sterge(int x, int y)
{
    if(a[x]->x == y)
    {
        a[x]=a[x]->urm;
        return;
    }
    for(nod *i=a[x]; i->urm; i=i->urm)
    {
        if(i->urm->x==y)
        {
            i->urm=i->urm->urm;
        }
    }
}

void macaroane(int k)
{
    while(a[k])
    {
        if(nSol==0)
        {
            sol[nSol++]=k;
            continue;
        }
        else

        if(a[k] -> x == sol[0])
        {
            funct();
        }else

        {
        sol[nSol++]=a[k]->x;
        nod *x=a[k];
        a[k]=a[k]->urm;
        sterge(x->x,k);
        delete x;
        macaroane(a[k] -> x);

        }
    }
}

void rez()
{
    for(int i=0;i<=n;i++)
    {
        if(grad[i]!=0)
        {
            sol[nSol++]=i;
            macaroane(i);
            return;
        }
    }
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    //freopen("cilcueuler.out","w",stout);
    citire();
    for(int i=0;i<=n;i++)
    {
        if(grad[i]%2==1)
        {
            printf("-1");
            return 0;
        }
    }
    rez();
    for(int i=0;i<nSolMare;i++)
        printf("%d ",solMare[i]);

    return 0;
}