Cod sursa(job #640469)

Utilizator TeodoraTanaseTeodora Tanase TeodoraTanase Data 25 noiembrie 2011 20:52:03
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <cstdio>
#include <list>
#include <queue>
#include <stack>
#define N 100001

using namespace std;

int n, m, gr[N];
bool viz[N];

list <int> g[N], sol;
queue <int> q;
stack <int> s;

void citire()
{
    scanf ("%d %d ", &n, &m);
    while (m --)
    {
        int x, y;
        scanf ("%d %d ", &x, &y);
        g[x].push_back (y);
        g[y].push_back (x);
        ++ gr[x]; ++ gr[y];
    }
}

bool grade()
{
    for (int i = 1; i <= n; ++ i)
        if (gr[i] % 2 != 0)
            return  0;
    return 1;
}

void bfs(int v)
{
    q.push (v);
    viz[v] = 1;
    while (!q.empty())
    {
        v = q.front();
        q.pop();
        for (typeof (g[v].begin()) it = g[v].begin(); it != g[v].end(); ++ it)
            if (viz[*it] == 0)
            {
                q.push (*it);
                viz[*it] = 1;
            }
    }
}

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

void sterge(int x, int y)
{
    -- gr[x]; -- gr[y];
    g[x].pop_front();
    for (typeof (g[y].begin()) it = g[y].begin(); it != g[y].end(); ++ it)
        if (*it == x)
        {
            g[y].erase (it);
            break;
        }
}

void euler(int v)
{
    while (!g[v].empty())
    {
        int w = g[v].front();
        s.push (v);
        sterge (v, w);
        v = w;
    }
}

void afisare()
{
    int v = 1;
    do
    {
        euler (v);
        v = s.top(); s.pop();
        sol.push_front (v);
    }
    while (!s.empty());
    for (typeof (sol.begin()) it = sol.begin(); it != sol.end(); ++ it)
        printf ("%d ", *it);
    printf ("\n");
}

int main()
{
    freopen ("ciclueuler.in", "r", stdin);
    freopen ("ciclueuler.out", "w", stdout);
    citire();
    if (!conex() && !grade())
        printf ("-1\n");
    else
        afisare();
    return 0;
}