Cod sursa(job #495101)

Utilizator ionutz32Ilie Ionut ionutz32 Data 23 octombrie 2010 23:36:26
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <cstdio>
#include <list>
#include <stack>
#include <bitset>
#include <queue>

using namespace std;

int n,m,x,y,nod,i,grad[100005];
list<int> graf[100005];
list<int>::iterator u;
stack<int> s;
queue<int> q;
bitset<100005> viz;
bool k;

void ciclu(int nod)
{
    int vecin;
    while (grad[nod])
    {
        s.push(nod);
        vecin=graf[nod].front();
        graf[nod].pop_front();
        --grad[nod];
        --grad[vecin];
        for (u=graf[vecin].begin();u!=graf[vecin].end();++u)
            if (*u==nod)
            {
                graf[vecin].erase(u);
                break;
            }
        nod=vecin;
    }
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d %d",&n,&m);
    while (m--)
    {
        scanf("%d %d",&x,&y);
        graf[x].push_back(y);
        graf[y].push_back(x);
        ++grad[x];
        ++grad[y];
    }
    k=true;
    for (i=1;i<=n;++i)
        if (grad[i] & 1)
        {
            k=false;
            break;
        }
    if (k)
    {
        q.push(x);
        while (!q.empty())
        {
            for (u=graf[q.front()].begin();u!=graf[q.front()].end();++u)
                if (!viz.test(*u))
                {
                    viz.flip(*u);
                    q.push(*u);
                }
            q.pop();
        }
        for (i=1;i<=n;++i)
            if (!grad[i] && !viz.test(i))
            {
                k=false;
                break;
            }
    }
    if (!k)
    {
        printf("-1");
        return 0;
    }
    nod=1;
    do
    {
        printf("%d ",nod);
        ciclu(nod);
        nod=s.top();
        s.pop();
    }
    while (!s.empty());
    return 0;
}