Cod sursa(job #2156624)

Utilizator mlc_oficialBoris Barca mlc_oficial Data 8 martie 2018 21:16:21
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

const int kMaxN = 1e5, kMaxM = 5e5;

ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");

struct Edge {
    int x, y;
} edge[kMaxM];

int idx[kMaxN + 1], edge_idx[2 * kMaxM];
bool used_edge[kMaxM];

void Df(const int node) {
    for (int iter = idx[node]; iter != idx[node + 1]; ++iter) {
        const int e = edge_idx[iter];
        if (used_edge[e]) {
            continue;
        }
        
        used_edge[e] = true;
        Df(edge[e].x ^ edge[e].y ^ node);
        cout << node + 1 << ' ';
    }
}

int main() {
    int n, m; cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        int x, y; cin >> x >> y; --x; --y;
        edge[i] = {x, y};
    }
    
    for (int i = 0; i < m; ++i) {
        ++idx[edge[i].x];
        ++idx[edge[i].y];
    }
    for (int i = 1; i <= n; ++i) {
        idx[i] += idx[i - 1];
    }
    for (int i = 0; i < m; ++i) {
        edge_idx[--idx[edge[i].x]] = i;
        edge_idx[--idx[edge[i].y]] = i;
    }
    
    for (int i = 0; i < n; ++i) {
        if (idx[i + 1] % 2 != idx[i] % 2) {
            cout << -1 << endl;
            return 0;
        }
    }
    
    Df(0);
}