Cod sursa(job #1423219)

Utilizator cldmeClaudiu Ion cldme Data 21 aprilie 2015 16:19:52
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
using namespace std;
int const N=100001;
int const M=500001;

struct muchie{
    int x,y;
};

muchie v[M];
int lst[N],edge[2*M],urm[2*M],m,n,nr,sol[N];
bool viz[M];

void addEdge(int x, int y)
{
    edge[++nr] = y;
    urm[nr] = lst[x];
    lst[x] = nr;
}

int varf(int i, int nod)
{
    if(v[i].x == nod)
        return v[i].y;
    return v[i].x;
}

void euler(int x)
{
    int p,m,n;
    p = lst[x];
    //viz[x] = true;
    while(p != 0)
    {
        if(!viz[edge[p]])
        {
            viz[edge[p]] = true;
            euler(varf(edge[p],x));
        }
        p = urm[p];
    }
    sol[++nr] = x;
}

bool check(int n)
{
    for(int i=1; i<=n; i++)
        if(!viz[i]) return false;
    return true;
}

void afis()
{
    for(int i=1; i<nr; i++)
        printf("%d ",sol[i]);
}

int main()
{
    int i,n,m;
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i=1; i<=m; i++)
    {
        scanf("%d %d",&v[i].x,&v[i].y);
        addEdge(v[i].x,i);
        addEdge(v[i].y,i);
    }

    nr = 0;
    euler(1);

    if(check(m))
        afis();
    else printf("-1");

    return 0;
}