Cod sursa(job #680419)

Utilizator AplayLazar Laurentiu Aplay Data 15 februarie 2012 16:33:12
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include<stdio.h>
#include<stdlib.h>
#include<fstream>
using namespace std;
typedef struct nod { int x; nod *urm; }NODE;
NODE *v[100010];
int n,m,grad[100010],c[300010],viz[100010],ok=1,nr;
FILE *g=fopen("ciclueuler.out","w");
int st[100010],top,sol[100010],sus;

void citire()
{
    ifstream f("ciclueuler.in");
    f>>n>>m;
    int x,y;
    NODE *q;
    for(int i=0;i<m;++i)
    {
        f>>x>>y;
        q=(NODE*)malloc(sizeof(NODE));
        q->x=y;
        q->urm = v[x];
        v[x]=q;
        q=(NODE*)malloc(sizeof(NODE));
        q->x=x;
        q->urm=v[y];
        v[y]=q;
        grad[x]++;
        grad[y]++;
    }
}

int bfs()
{
    int p,u;
    NODE *q;
    p=u=0;
    c[0]=1; ++nr;
    viz[1]=1;
    while(p<=u)
    {
        q=v[c[p]];
        while(q)
        {
            if(!viz[q->x])
            {
                viz[q->x]=1;
                c[++u]=q->x;
                ++nr;
            }
            q=q->urm;
        }
        ++p;
    }
    if(nr==n) return 1;
    return 0;
}

int verif()
{
    if(bfs())
    {
        for(int i=1;i<=n;++i)
            if(grad[i]%2==1) return 0;
        return 1;
    }
    return 0;
}

void sterge(int u, int w)
{
    NODE *q,*t;
    q=v[u];
    q=q->urm;
    v[u]=q;
    q=v[w];
    if(q->x==u) v[w]=q->urm;
    else while(q->urm)
    {
        if(q->urm->x==u)
        {
            q->urm=q->urm->urm;
            break;
        }
        q=q->urm;
    }

}

void euler(int u)
{
    NODE *q;
    while(true)
    {
        q=v[u];
        if(q==NULL) break;
        int w=q->x;
        st[++top]=u;
        sterge(u,w);
        u=w;
    }
}

void rezolva()
{
    int u=1;
    sol[++sus]=1;
    do
    {
        euler(u);
        u=st[top--];
        sol[++sus]=u;
    }while(top);
}


int main()
{
    citire();
    if(verif()==0) fprintf(g,"-1");
    else
    {
        rezolva();
        for(int i=1;i<sus;++i)
            fprintf(g,"%d ",sol[i]);
    }
    fclose(g);
    return 0;
}