Cod sursa(job #2343496)

Utilizator enedumitruene dumitru enedumitru Data 14 februarie 2019 01:38:44
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("ciclueuler.in"); ofstream g("ciclueuler.out");
const int MAXN = 100000 + 16;
const int MAXM = 500000 + 16;
vector < pair < int, int > > Edge[MAXN],returnBranch[MAXN];
bitset < MAXM > VizM;
bitset < MAXN > VizN;
stack < unsigned int > ST,iterate;
int N,M,Deg[MAXN];
void citire()
{   f>>N>>M;
    for(int a,b,i=1;i<=M;++i)
    {   f>>a>>b;
        Edge[a].push_back(make_pair(b, i));
        Edge[b].push_back(make_pair(a, i));
        ++Deg[a]; ++Deg[b];
    }
}
inline bool isValid()
{   for(int i=1;i<=N;++i)
        if(Deg[i]&1) return false;
    return true;
}
void dfs(int rad)
{   ST.push(rad);
    iterate.push(0);
    while(!ST.empty())
    {   int nod=ST.top();
        int poz=iterate.top();
        VizN.set(nod);
        while((unsigned)poz < Edge[nod].size() && VizM.test(Edge[nod][poz].second)) ++poz;
        if((unsigned)poz >= Edge[nod].size()) {ST.pop(); iterate.pop();}
        else
        {   int next=Edge[nod][poz].first;
            int id=Edge[nod][poz].second;
            VizM.set(id);
            iterate.top()=++poz;
            if(VizN.test(next))
            {   returnBranch[nod].push_back(make_pair(next, id));
                returnBranch[next].push_back(make_pair(nod, id));
            }
            else {ST.push(next); iterate.push(0);}
        }
    }
}
void createEuler(int nod)
{   for(int i=1;i<=M;++i)
    {   g<<nod<<' ';
        bool need=true;
        if(!returnBranch[nod].empty())
        {   need=false;
            while(!returnBranch[nod].empty() && VizM.test(returnBranch[nod].back().second))
                returnBranch[nod].pop_back();
            if(!returnBranch[nod].empty())
            {   int next=returnBranch[nod].back().first;
                VizM.set(returnBranch[nod].back().second);
                returnBranch[nod].pop_back();
                nod=next;
            }
            else need=true;
        }
        if(need)
        {   while(!Edge[nod].empty() && VizM.test(Edge[nod].back().second)) Edge[nod].pop_back();
            int next=Edge[nod].back().first;
            VizM.set(Edge[nod].back().second);
            Edge[nod].pop_back();
            nod=next;
        }
    }
}
int main()
{   citire();
    if(isValid()) {dfs(1); createEuler(1);} else g<< "-1\n";
    g.close(); return 0;
}