Cod sursa(job #3226761)

Utilizator Alex_DumitrascuAlex Dumitrascu Alex_Dumitrascu Data 22 aprilie 2024 19:02:13
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
//3 4 3 2 2 1
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");

list <int> g[100005];
int grad[100005];
stack <int> sol;
bool viz[100005];
void dfs (int nod)
{
    viz[nod]=1;
    for (auto it=g[nod].begin(); it!=g[nod].end(); it++) {
        if (!viz[*it]) {
            dfs(*it);
        }
    }
}
void sterge_muchie (int a, int b)
{
    //cout<<a<<' '<<b<<endl;
    for (auto it=g[a].begin(); it!=g[a].end(); it++) {
        if (*it==b) {
            g[a].erase(it);
            break;
        }
    }
    //if (a==b) return;
    for (auto it=g[b].begin(); it!=g[b].end(); it++) {
        if (*it==a) {
            g[b].erase(it);
            break;
        }
    }
}
stack <int> st;
void pseudodfs (int nod)
{
    st.push(nod);
    while (!st.empty()) {
        nod=st.top(); st.pop();

        int nd, lnd=nod;
        do {
            nd=nod;
            if (g[lnd].size()==0) break;
            for (auto it=g[lnd].begin(); it!=g[lnd].end(); it++) {
                if (*it!=lnd) {
                    nd=*it;
                    break;
                }
            }
            if (nd==-1) break;
            //cout<<lnd<<' '<<nd<<endl;
            sterge_muchie(lnd, nd);
            sol.push(lnd);
            lnd=nd;

        } while (nd!=nod);
        while (!sol.empty()) {
            nod=sol.top();
            sol.pop();
            fout<<nod<<' ';
            st.push(nod);
            break;
        }

    }
}

int main()
{
    int n, m, a, b;
    fin>>n>>m;
    for (int i=1; i<=m; i++) {
        fin>>a>>b;
        g[a].insert(g[a].end(), b);
        //cout<<a<<' '<<b<<endl;
        g[b].insert(g[b].end(), a);
        grad[a]++; grad[b]++;
    }
    //cout<<endl;
    dfs(1);
    bool e_eulerian=true;
    for (int i=1; i<=n; i++) {
        //cout<<grad[i]<<endl;
        if (viz[i]==0) {
            e_eulerian=false;
            break;
        }
        if (grad[i]%2==1||grad[i]==0) {
            e_eulerian=false;
            break;
        }
    }
    if (!e_eulerian) {
        fout<<-1;
        return 0;
    }
    //sol.push(1);
    pseudodfs(1);
    return 0;
}