Cod sursa(job #2857117)

Utilizator norryna07Alexandru Norina norryna07 Data 24 februarie 2022 21:34:55
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>
using namespace std;

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

vector < vector <int> > g;
vector < pair <int, int> > e;
vector <int> sol;
bitset <500005> used;
int n, m;

void citire()
{
    fin>>n>>m;
    int x, y;
    g = vector < vector <int> > (n+2);
    e = vector < pair <int, int> > (m+2);
    for (int i=1; i<=m; ++i)
    {
        fin>>x>>y;
        g[x].push_back(i);
        g[y].push_back(i);
        e[i].first=x; e[i].second=y;
    }
    fin.close();
}

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

void make_euler()
{
    int ed, x, y;
    stack <int> st;
    st.push(1);
    while (!st.empty())
    {
        x=st.top();
        if (!g[x].empty())
        {
            ed=g[x].back(); g[x].pop_back();
            if (!used[ed])
            {
                used[ed]=1;
                int to = e[ed].first ^ e[ed].second ^ x;
                st.push(to);
            }
        }
        else
        {
            st.pop();
            sol.push_back(x);
        }
    }
}

int main()
{
    citire();
    if (!euler()) {fout<<-1; return 0;}
    else 
    {
        make_euler();
        for (int i=0; i<sol.size()-1; i++) fout<<sol[i]<<' ';
    }
    return 0;
}