Cod sursa(job #2121098)

Utilizator LittleWhoFeraru Mihail LittleWho Data 3 februarie 2018 11:54:45
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
using namespace std;

struct edge {
    int x;
    int y;
};

vector<edge> adj[100001];
bitset<500001> edges;
int gr[100001];
vector<int> sol;
stack<int> st;

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

    int n, m;
    scanf("%d %d", &n, &m);

    int edgeCnt = 0;
    for (int i = 0, x, y; i < m; i++) {
        scanf("%d %d", &x, &y);
        //cout << x << " " << y << endl;
        adj[x].push_back({y, edgeCnt}); gr[x]++;
        adj[y].push_back({x, edgeCnt}); gr[y]++;
        edgeCnt++;
    }

    for (int i = 1; i <= n; i++) {
        if (gr[i] % 2) {
            cout << -1 << "\n";
            return 0;
        }
    }

    st.push(1);
    while (!st.empty()) {
        int node = st.top();
        //cout << node << endl;

        if (gr[node]) {
            for (auto &it: adj[node]) {
                if (!edges[it.y]) {
                    edges[it.y] = true;
                    gr[it.x]--;
                    gr[node]--;
                    st.push(it.x);
                    break;
                }
            }

        } else {
            sol.push_back(node);
            st.pop();
        }
    }

    for (int i = 0; i < sol.size() -1; i++) {
        cout << sol[i] << " ";
    }
    cout << "\n";

    return 0;
}