Cod sursa(job #632576)

Utilizator TeodoraTanaseTeodora Tanase TeodoraTanase Data 11 noiembrie 2011 17:53:45
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <cstdio>
#define N 100003

using namespace std;

int n, m, viz[N], mic[N], mare[N], k, l;

struct nod
{
    int x;
    nod *urm;
} *a[N];

void add(nod *&p, int x)
{
    nod *q = new nod;
    q -> x = x;
    q -> urm = p;
    p = q;
}

void citire()
{
    scanf ("%d %d ", &n, &m);
    for (int i = 1; i <= m; ++ i)
    {
        int x, y;
        scanf ("%d %d ", &x, &y);
        if (x != y)
        {
            add (a[x], y);
            add (a[y], x);
        }
    }
}

void afisare()
{
    for (int i = 0; i < k - 1; ++ i)
        printf ("%d ", mare[i]);
    printf ("\n");
}

bool grade()
{
    for (int i = 1; i <= n; ++ i)
    {
        int nr = 0;
        for (nod *j = a[i]; j; ++nr, j = j -> urm);
        if (nr % 2 != 0)
            return 0;
    }
    return 1;
}

bool izolat(int i)
{
    for (nod *j = a[i]; j; j = j -> urm)
        if (j -> x > 0)
            return 0;
    return 1;
}

void euler(int i)
{
    mic[l ++] = i;
    for (nod *j = a[i]; j; j = j -> urm)
        if (j -> x != 0)
        {
            int aux = j -> x;
            j -> x = 0;
            for (nod *z = a[aux]; z; z = z -> urm)
                if (z -> x == i)
                {
                    z -> x = 0;
                    break;
                }
            euler (aux);
        }
}

void adauga(int x)
{
    for (int i = 0; i < k; ++ i)
        if (mare[i] == x)
        {
            for (int j = k - 1; j > i; -- j)
                mare[j + l] = mare[j];
            for (int j = i; j < i + l; ++ j)
                mare[j] = mic[j - l];
            return;
        }
    for (int i = 0; i < l; ++ i)
        mare[i] = mic[i];
    k = l;
}

void ciclu()
{
    for (int i = 1; i <= n; ++ i)
        if (!izolat (i))
        {
            euler (i);
            adauga (i);
            l = 0;
        }
}

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