Cod sursa(job #534562)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 15 februarie 2011 20:47:04
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <stdio.h>
#define TR(C, it)\
    for(typeof(C.begin()) it = C.begin(); it != C.end(); it++)
#define pb push_back

using namespace std;

const int nmax = 100000;
int N, M;
int deg[nmax];
list <int> G[nmax];

void read()
{
    int i, x, y;
    scanf("%d %d",&N,&M);
    for(i = 1; i <= M; i++)
    {
        scanf("%d %d",&x,&y);
        deg[x]++;deg[y]++;
        G[x].pb(y);
        G[y].pb(x);
    }
}

int viz[nmax];
queue <int> Q;

int BFS()
{
    queue <int> Q;
    int cate = N - 1, x;
    Q.push(1);
    viz[1] = 1;
    while(!Q.empty())
    {
        x = Q.front();
        Q.pop();
        TR(G[x], i)
            if(!viz[*i])
            {
                Q.push(*i);
                viz[*i] = 1;
                cate--;
            }
    }
    return (!cate);
}

int conex()
{
    int i;
    for(i = 1; i <= N; i++)
        if(deg[i] & 1)
            return 0;

    return BFS();
}

stack <int> S;

void sterge(int v, int w)
{
    deg[v]--, deg[w]--;
    G[v].pop_front();
    TR(G[w], it)
        if(*it == v)
        {
            G[w].erase(it);
            return;
        }
}


void baga(int v)
{
    while(!G[v].empty())
    {
        int w = G[v].front();
        S.push(v);
        sterge(v, w);
        v = w;
    }
}

list<int> F;

void euler()
{
    int v = 1;
    do
    {
        baga(v);
        v = S.top();
        S.pop();
        F.pb(v);
    } while(!S.empty());
}

int main()
{
    freopen ("ciclueuler.in","r",stdin);
    freopen ("ciclueuler.out","w",stdout);

    read();
    if(conex())
    {
        euler();
        TR(F, i)
            printf("%d ",*i);
    }
    else printf("-1");
    printf("\n");

    return 0;
}