Cod sursa(job #2422487)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 18 mai 2019 22:16:04
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;

int n, m;

struct Muchie
{
    int a, b, used;
    int other(int x)
    {
        return a == x ? b : a;
    }
} mc[500010];

vector<int> g[100010];
int gr[100010];
int pad[100010];

int tata(int nod)
{
    if(pad[nod] == nod)
        return nod;
    int t = tata(pad[nod]);
    pad[nod] = t;
    return t;
}

int main() {
    cin.sync_with_stdio(false);
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        pad[i] = i;
    for(int i = 0; i < m; i++)
    {
        int a, b;
        cin >> a >> b;
        mc[i].a = a;
        mc[i].b = b;
        mc[i].used = 0;
        g[a].push_back(i);
        g[b].push_back(i);
        gr[a]++;
        gr[b]++;
        pad[tata(a)] = tata(b);
    }
    int tataMare = tata(1);
    for(int i = 1; i <= n; i++)
    {
        if(tata(i) != tataMare || gr[i] % 2 != 0)
        {
            cout << -1;
            return 0;
        }
    }
    vector<int> st;
    st.push_back(1);
    vector<int> result;
    while(!st.empty())
    {
        int nod = st.back();
        while(!g[nod].empty())
        {
            if(mc[g[nod].back()].used)
            {
                g[nod].pop_back();
            }
            else break;
        }
        if(g[nod].empty())
        {
            result.push_back(nod);
            st.pop_back();
        }
        else
        {
            mc[g[nod].back()].used = 1;
            st.push_back(mc[g[nod].back()].other(nod));
            g[nod].pop_back();
        }

    }
    result.pop_back();
    for(int nod : result)
        cout << nod << " ";
    return 0;
}