Cod sursa(job #2374147)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 7 martie 2019 17:11:32
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <iomanip>
#define ll long long
#define lsb(x) (x & -x)

using namespace std;

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

struct EDGE {
    int from, to, del;
};

stack<int> stk;

void euler(int from, vector<vector<int>> &g, vector<EDGE> &edge) {
    if(g[from].size()) {
        int i = g[from].back();
        g[from].pop_back();
        if(edge[i].del == 0) {
            edge[i].del = 1;
            int to = edge[i].to;
            if(to == from)
                to = edge[i].from;
            euler(to, g, edge);
        }
        euler(from, g, edge);
    } else
        stk.push(from);
}

int main() {

    int n, m;
    in >> n >> m;
    vector<EDGE> e(m + 1, {0, 0, 0});
    vector<vector<int>> g(n + 1);
    for(int i = 1; i <= m; i ++) {
        in >> e[i].from >> e[i].to;
        g[e[i].from].push_back(i);
        g[e[i].to].push_back(i);
    }

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

    euler(1, g, e);
    while(stk.size() > 1) {
        out << stk.top() << " ";
        stk.pop();
    }

    return 0;
}