Cod sursa(job #2083740)

Utilizator enedumitruene dumitru enedumitru Data 8 decembrie 2017 07:37:32
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
#define pii pair <int, int>
#define x first
#define y second
using namespace std;
ifstream fin("ciclueuler.in"); ofstream fout("ciclueuler.out");
const int Nmax=100005;
const int Mmax=500005;
int n,m,g[Nmax];
bitset <Mmax> vizm;
bitset <Nmax> vizn;
vector <pii> L[Nmax];
stack <int> S;
vector <int> C;
void dfs(int nod)
{   vizn[nod]=true;
    for(unsigned int i=0;i<L[nod].size();++i)
        if(L[nod][i].x) dfs(L[nod][i].x);
}
int main()
{   fin>>n>>m;
    for(int a,b,i=1;i<=m;++i)
    {   fin>>a>>b;
        L[a].push_back(make_pair(b,i)); g[a]++;
        L[b].push_back(make_pair(a,i)); g[b]++;
    }
    dfs(1);
    for(int i=1;i<=n;++i)
        if(!vizn[i]) {fout<<-1; return 0;}
    for(int i=1;i<=n;++i)
        if(g[i]%2) {fout<<-1; return 0;}
    S.push(1);
    while(!S.empty())
    {   int nod=S.top();
        if(!g[nod]) {C.push_back(nod); S.pop();}
        else
        {   /// din capat, scot tot ce a foS vizmosit deja pentru a ajugne la un nou bun
            while(vizm[L[nod].back().y]) L[nod].pop_back();
            int nod1=L[nod].back().x; ///nod bun
            g[nod]--;
            g[nod1]--;
            vizm[L[nod].back().y]=true;
            L[nod].pop_back();
            S.push(nod1);
        }
    }
    for(int i=C.size()-1;i;--i) fout<<C[i]<<" ";
    return 0;
}