Cod sursa(job #901861)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 1 martie 2013 12:02:43
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include<fstream>
#include<iostream>
#include<list>
#include<stack>
#include<queue>
#define NMAX 100010

using namespace std;

list<int> a[NMAX];
queue<int> q;
stack<int> s;
int n, m, vz[NMAX], d[NMAX];

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");


void Citeste()
{
    int x, y, i;

    f>>n>>m;

    for (i=1; i<=m; ++i)
    {
        f>>x>>y;
        a[x].push_back(y); ++d[x];
        a[y].push_back(x); ++d[y];
    }
}

void DFS(int nod)
{
    list<int> :: iterator it;

    vz[nod]=1;

    for (it=a[nod].begin(); it!=a[nod].end(); ++it)
        if (!vz[*it]) DFS(*it);
}

int bun()
{
    int i;

    DFS(1);

    for (i=1; i<=n; ++i)
        if (!vz[i]  || d[i]%2==1) return 0;

    return 1;
}

void Cauta(int nod, int cnod)
{
    int ap=0;

    list<int> :: iterator it;

    --d[nod];
    for (it=a[nod].begin(); it!=a[nod].end(); ++it)
        if (*it==cnod)
        {
            if ((cnod==nod && ap==1) || cnod!=nod )
            {
                --d[cnod];
                a[nod].erase(it);
                break;
            }
            else ap=1;
        }
}

void Ciclu(int nod)
{
    int x;
    while (true)
    {
        if (a[nod].empty()) break;
        else
        {
            s.push(nod);
            Cauta(*a[nod].begin(), nod);
            x=*a[nod].begin();
            a[nod].erase(a[nod].begin());
            nod=x;
        }
    }
}

void Construieste()
{
    int v=1;
    do
    {
        Ciclu(v);
        v=s.top(); s.pop();
        q.push(v);
    }while (!s.empty());

    while (!q.empty())
    {
        g<<q.front()<<" ";
        q.pop();
    }
}

int main()
{
    Citeste();

    if (bun()) Construieste();
    else g<<"-1";
    f.close();
    g.close();
    return 0;
}