Cod sursa(job #2084973)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 9 decembrie 2017 14:07:41
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
#define MN 100005
#define MM 500005
#define x first
#define y second
#define pii pair <int, int>
#define pb push_back
#define mp make_pair
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
typedef unsigned int ui;
int N, M, deg[MN];
bitset <MN> vizN;
bitset <MM> vizM;
vector <pii> V[MM];
stack <int> S;
vector <int> C;

void dfs(int nod)
{
    vizN.set(nod);
    for(ui i = 0; i < V[nod].size(); ++i)
        if(!vizN.test(V[nod][i].x))
            dfs(V[nod][i].x);
}

int main()
{
    in >> N >> M;
    for(int a, b, i = 1; i <= M; ++i)
    {
        in >> a >> b;
        V[a].pb(mp(b, i)); deg[a]++;
        V[b].pb(mp(a, i)); deg[b]++;
    }
    dfs(1);
    for(int i = 1; i <= N; ++i)
        if(!vizN.test(i) || deg[i]&1)
        {
            out << -1 << '\n';
            return 0;
        }
    S.push(1);
    while(!S.empty())
    {
        int nod = S.top();
        if(!deg[nod])
        {
            C.push_back(nod);
            S.pop();
        }
        else
        {
            while(vizM.test(V[nod].back().y) && !V[nod].empty()) V[nod].pop_back();
            int next = V[nod].back().x;
            deg[nod]--, deg[next]--;
            vizM.set(V[nod].back().y);
            V[nod].pop_back();
            S.push(next);
        }
    }
    for(ui i = 0; i < C.size()-1; ++i)
        out << C[i] << ' ';
    in.close(), out.close();
    return 0;
}