Cod sursa(job #916150)

Utilizator TeodoraTanaseTeodora Tanase TeodoraTanase Data 15 martie 2013 21:32:53
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <cstdio>
#include <list>
#include <stack>
#include <cstring>
#include <queue>

#define NMAX 100001

using namespace std;

list < int > G[NMAX];
stack < int > S;
queue < int > Q;

int n;
bool viz[NMAX];

void read()
{
    int m;
    int x;
    int y;

    freopen("ciclueuler.in", "r", stdin);

    scanf("%d %d\n", &n, &m);

    while(m --)
    {
        scanf("%d %d\n", &x, &y);

        G[x].push_back(y);
        G[y].push_back(x);
    }
}

void dfs(int v)
{
    viz[v] = 1;

    for(typeof(G[v].begin()) i = G[v].begin(); i != G[v].end(); ++ i)
    {
        int x = *i;

        if(!viz[x])
            dfs(x);
    }
}

bool isConex()
{
    dfs(1);

    for(int i = 1; i <= n; ++ i)
        if(!viz[i])
            return 0;

    return 1;
}

bool isEuler()
{
    memset(viz, 0, sizeof(viz));
    if(!isConex())
        return 0;

    for(int i = 1; i <= n; ++ i)
        if(G[i].size() % 2 != 0)
            return 0;

    return 1;
}

void Remove(int x, int y)
{
    for(typeof(G[y].begin()) i = G[y].begin(); i != G[y].end(); ++ i)
        if(*i == x)
        {
            G[y].erase(i);
            return;
        }
}

void Euler(int v)
{
    while(!G[v].empty())
    {
        int w = G[v].front();
        G[v].pop_front();
        Remove(v, w);

        S.push(v);
        v = w;
    }
}

void findCicle()
{
    int v = 1;

    do {
        Euler(v);

        v = S.top();
        S.pop();
        Q.push(v);
    } while(!S.empty());
}

void write()
{
    while(!Q.empty())
    {
        printf("%d ", Q.front());
        Q.pop();
    }

    printf("\n");
}

int main()
{
    read();

    freopen("ciclueuler.out", "w", stdout);
    if(!isEuler())
    {
        printf("-1\n");
        return 0;
    }

    findCicle();
    write();

    return 0;
}