Cod sursa(job #1441130)

Utilizator tudoras8tudoras8 tudoras8 Data 23 mai 2015 18:51:48
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <list>

using namespace std;

#define MAXN 100010

int N, M;
vector<int> G[MAXN];
int viz[MAXN];
list<int> c;

void bfs(int sursa) {
    queue<int> Q;

    Q.push(sursa);
    viz[sursa] = 1;

    while (!Q.empty()) {
        int u = Q.front();
        Q.pop();

        for (int v : G[u]) {
            if (!viz[v]) {
                Q.push(v);
                viz[v] = 1;
            }
        }
    }
}

void euler(int u) {
    stack<int> S;
    S.push(u);
    while (!S.empty()) {
        int u = S.top();
        while (!G[u].empty()) {
            int v = G[u].back();

            // sterge muchia de la u la v
            G[u].pop_back();

            // sterge muchia de la v la u
            for (auto it = G[v].begin(); it != G[v].end(); ++it) {
                if (u == *it) {
                    G[v].erase(it);
                    break;
                }
            }

            S.push(v);
            u = v;
        }
        c.push_back(u);
        S.pop();
    }
}

int main()
{
    iostream::sync_with_stdio(false);

    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);

    cin >> N >> M;
    int a, b;
    for (int i = 1; i <= M; ++i) {
        cin >> a >> b;
        G[a].push_back(b);
        G[b].push_back(a);
    }

    // ## verific daca multigraful este eulerian
    // 1. verific daca gradul unui nod din multigraf este impar
    for (int i = 1; i <= N; i++) {
        if (G[i].size() % 2 == 1) {
            cout << "-1";
            return 0;
        }
    }
    // 2.verific daca multigraful nu este conex
    bfs(1);
    for (int i = 2; i <= N; ++i) {
        if (viz[i] == 0) {
            cout << "-1";
            return 0;
        }
    }

    euler(1);
    for (int x : c) {
        cout << x << " ";
    }

    return 0;
}