Cod sursa(job #654486)

Utilizator nandoLicker Nandor nando Data 30 decembrie 2011 16:15:40
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <queue>
#include <stack>
#include <bitset>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;

FILE* fin = fopen("ciclueuler.in", "r");

#define MAXN 50050
typedef vector<int>::iterator iter;

int n, m;
int grd[MAXN];
vector<int> g[MAXN];
stack<int> stk;

bool isConnex()
{
    bitset<MAXN> viz;
    queue<int> q;
    q.push(1);

    viz[1] = true;
    while (!q.empty()) {
        int nd = q.front();
        q.pop();

        for (iter it = g[nd].begin(); it != g[nd].end(); ++it) {
            if (!viz[*it]) {
                viz[*it] = true;
                q.push(*it);
            }
        }
    }

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

    return true;
}

int euler(int nd)
{
    while (!g[nd].empty()) {
        int v = *(g[nd].begin());
        g[nd].erase(g[nd].begin());

        stk.push(nd);

        int erased = 0;
        for (iter it = g[v].begin(); it != g[v].end(); ++it) {
            if (*it == nd) {
                erased = *it;
                g[v].erase(it);
                break;
            }
        }

        nd = v;
    }
}

int main()
{
    fscanf(fin, "%d %d\n", &n, &m);
    freopen("ciclueuler.out", "w", stdout);

    for (int i = 0, x, y; i < m; ++i) {
        fscanf (fin, "%d %d\n", &x, &y);
        grd[x] ++, grd[y] ++;

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

    fclose(fin);

    if (!isConnex()) {
        printf ("-1\n");
        return 0;
    }

    for (int i = 1; i <= n; ++i) {
        if (grd[i] & 1) {
            printf ("-1\n");
            return 0;
        }
    }

    vector<int> list;

    int nd = 1;
    do {
        euler(nd);
        nd = stk.top();
        list.push_back(nd);
        stk.pop();
    } while (!stk.empty());

    for (iter it = list.begin(); it != list.end(); ++it) {
        printf ("%d ", *it);
    }

    printf ("\n");

    return 0;
}