Cod sursa(job #3267627)

Utilizator nicushor21Pirlog Marian Nicolae nicushor21 Data 11 ianuarie 2025 16:37:40
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
#define MAX1 100000
#define MAX2 500000
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n,m,x,y,i,j,S[MAX2+10],G[MAX1+10],st,sol[MAX2+10],cnt;
bitset <MAX2+10> fr;
bitset <MAX1+10> mers;
queue <int> q;
struct elem{
    int nod,id;
};
vector <elem> g[MAX1+10];
void dfs(int x){
    mers[x] = 1;
    for(auto &it:g[x]){
        if(!mers[x]){
            dfs(it.nod);
        }
    }
}
int main()
{
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y;
        g[x].push_back({y,i});
        g[y].push_back({x,i});
        G[x]++;
        G[y]++;
    }
    for(i=1;i<=n;i++){
        if(G[i]){
            dfs(i);
            st = i;
        }
    }
    for(i=1;i<=n;i++){
        if(G[i]%2 != 0){
            fout<<"-1";
            return 0;
        }
        if(G[i] > 0 && !mers[i]){
            fout<<"-1";
            return 0;
        }
    }
    S[1] = st;
    j = 1;
    while(j){
        if(G[S[j]] == 0){
            sol[++cnt] = S[j--];
            continue;
        }
        while(fr[g[S[j]].back().id])
            g[S[j]].pop_back();

        x = g[S[j]].back().nod;
        y = g[S[j]].back().id;
        fr[y] = 1;
        G[x]--;
        G[S[j]]--;
        S[++j] = x;
    }
    for(i=2;i<=cnt;i++){
        fout<<sol[i]<<' ';
    }
    return 0;
}