Cod sursa(job #2217262)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 29 iunie 2018 19:32:47
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");

const int MMAX = 500005;
const int NMAX = 100005;

struct Edge{
    int from, to;
    bool del;
}e[MMAX];

vector<int> g[NMAX];

bool visited[NMAX];
int dfs(int node) {
    int sum = 1;
    for(int i : g[node]) {
        int u = e[i].from;
        if(u == node)
            u = e[i].to;
        if(!visited[u]) {
            visited[u] = 1;
            sum += dfs(u);
        }
    }
    return sum;
}

stack<int> stk;
void euler(int node) {
    if(g[node].size()) {
        int pedge = g[node].back();
        g[node].pop_back();
        if(!e[pedge].del) {
            int to = e[pedge].to;
            if(to == node)
                to = e[pedge].from;
            e[pedge].del = 1;
            euler(to);
        }
        euler(node);
    } else
        stk.push(node);
}

int main() {
    ios::sync_with_stdio(false);
    int n, m;
    in >> n >> m;
    for(int i = 1; i <= m; i ++) {
        in >> e[i].from >> e[i].to;
        e[i].del = 0;
        g[e[i].from].push_back(i);
        g[e[i].to].push_back(i);
    }
    visited[1] = 1;
    int nr = dfs(1);
    if(nr != n) {
        out << -1;
        return 0;
    }
    for(int i = 1; i <= n; i ++) {
        if(g[i].size() % 2) {
            out << -1;
            return 0;
        }
    }
    euler(1);
    while(stk.size() > 1) {
        out << stk.top() << " ";
        stk.pop();
    }
    return 0;
}