Cod sursa(job #3216082)

Utilizator AlexInfoIordachioaiei Alex AlexInfo Data 15 martie 2024 17:06:42
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <bits/stdc++.h>

using namespace std;

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

#define pii pair<int, int>
#define pb push_back
#define fi first
#define se second

const int NMAX = 1e5 + 5;
const int INF = 0x3f3f3f3f;

int n, m, x, y;
vector<vector<int>> graph(NMAX);
vector<int> path;
pii edges[NMAX*5];
bool used[NMAX*5];

void read()
{
    in >> n >> m;
    for (int i = 1; i <= m; i++)
        in >> x >> y, graph[x].pb(i), graph[y].pb(i), edges[i] = {x, y};
}
void eulerPath()
{
    //drum (chiar ciclu) care contine toate muchiile
    vector<int> st;
    st.pb(1);

    while (!st.empty())
    {
        int node = st.back();
        if (graph[node].empty()) //nu mai face parte din nicio muchie
        //deci nu mai putem merge nicaieri, au fost epuizate muchiile pana la nodul asta, deci il putem in path
        {
            path.pb(node);
            st.pop_back(); //il stergem din stack
            continue;
        }

        int e = graph[node].back(); //ultima muchie din care face parte, practic aleatoriu
        graph[node].pop_back(); //am epuizat muchia
        if (!used[e]) //nu e folosita deja muchie (prin nodul celalalt al ei)
        {
            used[e] = true;
            int to = edges[e].fi ^ edges[e].se ^ node;
            //practic daca node = edges[e].fi, atunci se da edges[e].se
            //iar daca node = edges[e].se atunci se ia edges[e].fi
            // daca a = b atunci a ^ b = 0, si deci a^b^c = c;
            st.pb(to);
        }
    }
}

void solve()
{
    for (int i = 1; i <= n; i++)
        if (graph[i].size() % 2) //grad impar
        {
            out << "-1\n";
            return;
        }
    
    eulerPath();
    //path.end()-1 e adresa catre primul element din ciclu, nu-l mai afisez
    for (auto node = path.begin(); node <= path.end()-2; node++)
        out<<*node<<' ';
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(false);

    read();
    solve();

    return 0;
}