Cod sursa(job #1497820)

Utilizator alexpascadiAlexandru Pascadi alexpascadi Data 7 octombrie 2015 15:21:27
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>

using namespace std;

const int N = 100001;
const int M = 500001;

struct muchie
{
    int x;
    int y;
};

muchie v[M];
int e[M],urm[M];
int lst[N];
bool viz[M];
bool ajung[N],grad[N];
int c[M];
int nr=0, nc=0;

void adauga(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;
    return v[i].x;
}

void euler(int x)
{
    ajung[x]=1;
    int y,p,i;
    p=lst[x];
    while(p!=0)
    {
        i=e[p];
        y=celalalt(i,x);
        if(!viz[i])
        {
            viz[i]=1;
            euler(y);
        }
        p=urm[p];
    }
    c[++nc]=x;
}

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

    int n,m,i;
    fscanf(in,"%d%d",&n,&m);

    for(i=1;i<=m;i++)
    {
        fscanf(in,"%d%d",&v[i].x,&v[i].y);
        adauga(i);
        grad[v[i].x]=1-grad[v[i].x];
        grad[v[i].y]=1-grad[v[i].y];
    }

    for(i=1;i<=n;i++)
        if(grad[i])
        {
            fprintf(out,"-1");
            return 0;
        }

    euler(1);
    for(i=1;i<=n;i++)
        if(!ajung[i])
        {
            fprintf(out,"-1");
            return 0;
        }

    for(i=1;i<nc;i++)
        fprintf(out,"%d ",c[i]);

    return 0;
}