Cod sursa(job #632769)

Utilizator Viva12Ferentz Sergiu Viva12 Data 12 noiembrie 2011 12:02:17
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
#include <cstdio>
#define N 100000 + 50
#include <stack>
#include <queue>
using namespace std;
struct nod
{
    int inf;
    nod *urm;
}*l[N],*rez;
stack< int > S;
queue< int > Q;
int viz[N];
int deg[N];
void add(int x,nod *&p)
{
    nod *q= new nod;
    q->inf =x;
    q->urm =p;
    p=q;
}
int n;
int m;
int grad[N];
void read()
{
    int x;
    int y;
    scanf("%d %d",&n,&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d %d",&x,&y);
        add(x,l[y]);
        add(y,l[x]);
        grad[x]++;
        grad[y]++;
    }
    for(int i=1;i<=n;i++)
        {
            if(grad[i]==0)
                viz[i]=1;
        }
}
void bfs(int v)
{
    Q.push(v);
    viz[v]=1;
    while(!Q.empty())
    {
        v=Q.front();
        Q.pop();
        for(nod *j=l[v];j;j=j->urm)
            if(!viz[j->inf])
            {
                Q.push(j->inf);
                viz[j->inf]=1;
            }
    }

}
int conex()
{
    bfs(1);
    for(int v=2;v<=n;v++)
        {
            if(viz[v]==0)
            return 0;
        }

    return 1;

}

int verifEUL()
{
    if(conex()==0)
    return -1;

    for(int i=1;i<=n;i++)
        {
         if(grad[i]%2==1)
         return -1;
        }
    return 1;
}
void strgp(int v)
{
    nod *q=l[v];
    l[v]=l[v]->urm;
    delete q;
}
void strg(nod *&p)
{
    nod *q=p->urm;
    p->urm=p->urm->urm;
    delete q;
}

void sterge(int v,int w)
{
    deg[v]--;
    deg[w]--;
    strgp(v);
    for(nod *j=l[w];j&&j->urm;)
        {
            if(j->urm->inf==v)
                {
                    strg(j);
                }
            else
                j=j->urm;
        }
 }

void euler(int v)
{
        while(1)
        {   if(l[v]==NULL)
            break;
            int w=l[v]->inf;
            S.push(v);
            sterge(v,w);
            v=w;
        }

}
int solve()
{
    int v=verifEUL();
    if(v==-1)
    return -1;
    while(!S.empty())
    {
        euler(v);
        v=S.top();
        S.pop();
        add(v,rez);
    }
    return 1;
}
void afis(int k)
{
    if(k==-1)
        {
            printf("-1");
        }
    else
    {
        for(nod *j=rez;j;j=j->urm)
            {
                printf("%d ",*j);
            }
    }

}
int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    read();
    conex();
    S.push(1);
    int k=solve();
    afis(k);
    return 0;
}