Cod sursa(job #2539476)

Utilizator radugnnGone Radu Mihnea radugnn Data 5 februarie 2020 21:33:28
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>
#define DIM 100010
using namespace std;
ifstream fin ("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n,m,i,a,b,ok;
vector < pair<int,int> >L[DIM];
stack<int> S;
int out[DIM];
bitset<500010>F;
bitset<DIM> f;

void dfs(int nod){
    f[nod]=1;
    for(int i=0;i<L[nod].size();i++){
        int vecin=L[nod][i].first;
        if(!f[vecin])
            dfs(vecin);
    }
}
int main(){
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>a>>b;
        L[a].push_back({b,i});
        L[b].push_back({a,i});
        out[a]++;
        out[b]++;
    }

    for(i=0;i<=n;i++){
        if(out[i]){
            S.push(i);
            dfs(i);
            break;
        }
    }

    for(i=0;i<=n;i++)
        if(out[i]%2==1 || (out[i] && !f[i])){
            fout<<-1;
            return 0;
        }

    while(!S.empty()){
        int nod=S.top();
        if(!out[nod]){
            if(ok)
                fout<<nod<<" ";
            ok=1;
            S.pop();
            continue;
        }

        while(F[L[nod][L[nod].size()-1].second])
                L[nod].pop_back();
        F[L[nod][L[nod].size()-1].second]=1;

        int vecin=L[nod][L[nod].size()-1].first;
        out[nod]--;
        out[vecin]--;
        S.push(vecin);
    }

    return 0;
}