Cod sursa(job #2174724)

Utilizator mariakKapros Maria mariak Data 16 martie 2018 13:10:00
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define pii pair <int, int>
#define f first
#define s second
#define mp make_pair
FILE *fin  = freopen("ciclueuler.in", "r", stdin);
FILE *fout = freopen("ciclueuler.out", "w", stdout);

using namespace std;
const int Nmax = 1e5+5;
const int Mmax = 5e5+5;
/*------Data------*/
int n, m;
vector <pii> G[Nmax];
int deg[Nmax];

/*------Euler-----*/
bool ifCycle = true;
stack <int> st;
vector <int> cycle;
bitset <Mmax> seen;

void Read(){
    int u, v;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= m; ++ i){
        scanf("%d%d", &u, &v);
        G[u].push_back(mp(v, i));
        G[v].push_back(mp(u, i));
        deg[u]++; deg[v]++;
    }
}

int Next(int node){
    while(!G[node].empty() && seen.test(G[node].back().s))
        G[node].pop_back();
    pii nxt = G[node].back();
    G[node].pop_back();
    seen.set(nxt.s);
    deg[node]--; deg[nxt.f]--;
    return nxt.f;
}

void Euler(){
    for(int i = 1; i <= n; ++ i)
        if(deg[i] & 1){
            ifCycle = false;
            return;
        }

    int node = 1;
    while(node <= n && !deg[node]) node++;
    st.push(node);

    while(!st.empty()){
        node = st.top();
        if(deg[node])
            st.push(Next(node));
        else{
            cycle.push_back(node);
            st.pop();
        }
    }
}

int main(){
    Read();
    Euler();
    if(!ifCycle) printf("-1\n");
    else
        for(int i = 0; i < cycle.size()-1; ++ i){
            printf("%d ", cycle[i]);
        }
    return 0;
}