Cod sursa(job #1937104)

Utilizator cristina_borzaCristina Borza cristina_borza Data 23 martie 2017 18:41:28
Problema Ciclu Eulerian Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <vector>
#include <map>

#define DIM 700005

using namespace std;

ifstream f ("ciclueuler.in");
ofstream g ("ciclueuler.out");

int grad[DIM], c[DIM], ans[DIM];
int n, nrs, x, y, m;

map <pair <int, int>, int> mp;
vector <int> G[DIM];

void dfs (int node) {
    c[node] = 1;
    for (vector <int> :: iterator it = G[node].begin(); it != G[node].end(); ++it) {
        if (c[*it] == 0) {
            dfs (*it);
        }
    }
}

void euler (int node) {
    while (!G[node].empty () && mp[{G[node][G[node].size() - 1], node}] <= 0)
        G[node].pop_back ();

    while (!G[node].empty ()) {
        int v = G[node][G[node].size() - 1];
        --mp[{node, v}], --mp[{v, node}];
        G[node].pop_back();

        euler (v);
        while (!G[node].empty () && mp[{G[node][G[node].size() - 1], node}] <= 0)
            G[node].pop_back ();
    }

    ans[++nrs] = node;
}

int main() {
    f >> n >> m;
    for (int i = 1; i <= m; ++i) {
        f >> x >> y;
        G[x].push_back (y);
        G[y].push_back (x);

        ++mp[{x, y}];
        ++mp[{y, x}];

        ++grad[x];
        ++grad[y];
    }

    for (int i = 1; i <= n; ++i) {
        if (grad[i] % 2 == 1) {
            g << -1;
            return 0;
        }
    }

    dfs (1);
    for (int i = 1; i <= n; ++i) {
        if (c[i] == 0) {
            g << -1;
            return 0;
        }
    }

    euler (1);
    for (int i = 2; i <= nrs; ++i) {
        g << ans[i] << " ";
    }

    return 0;
}