Cod sursa(job #953751)

Utilizator chimistuFMI Stirb Andrei chimistu Data 27 mai 2013 11:02:28
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#define maxn 100010

using namespace std;

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

vector <int> A[maxn];
int grad[maxn],viz[maxn],n,m;
queue <int> coada;
stack <int> stiva;
list <int> lista;

void bfs(int nod)
{
    coada.push(nod);
    viz[nod] = 1;
    while (!coada.empty())
    {
        nod = coada.front();
        coada.pop();
        for (unsigned int i=0;i<A[nod].size();i++)
            if (viz[A[nod][i]] == 0)
            {
                coada.push(A[nod][i]);
                viz[A[nod][i]] = 1;
            }
    }
}

bool este_conex()
{
    bfs(1);
    for (int i=1;i<=n;i++)
        if (viz[i]==0)
            return false;
    return true;
}

bool eulerian()
{
    if (este_conex())
    {
        for (int i=1;i<=n;i++)
            if (grad[i]%2!=0)
                return false;
        return true;
    }
    else
        return false;
}

void sterge(int a, int b)
{
    vector <int>::iterator it;
    grad[a]--;
    grad[b]--;
    for (it=A[a].begin();it<A[a].end();it++)
        if (*it == b && !A[a].empty())
        {
            A[a].erase(it);
            break;
        }
    for (it=A[b].begin();it<A[b].end();it++)
        if (*it == a && !A[b].empty())
        {
            A[b].erase(it);
            break;
        }
}

void ciclu(int v)
{
    while (true)
    {
        if (A[v].empty())
            break;
        int w = A[v].front();
        stiva.push(v);
        sterge(v,w);
        v=w;
    }
}

int rezolvare()
{
    int i=1;
    if (!eulerian())
        return -1;
    do
    {
        ciclu(i);
        i = stiva.top();
        stiva.pop();
        lista.push_back(i);
    } while (!stiva.empty());
    return 1;
}

int main()
{
    int i,a,b;
    f >> n >> m;
    for (i=0;i<m;i++)
    {
        f >> a >> b;
        A[a].push_back(b);grad[a]++;
        A[b].push_back(a);grad[b]++;
    }
    if (rezolvare()==-1)
        g << -1 ;
    else
    {
        list<int>::iterator it;
        for (it=lista.begin();it!=lista.end();it++)
            g << *it << " ";
    }
    return 0;
}