Cod sursa(job #3217508)

Utilizator Alex_DumitrascuAlex Dumitrascu Alex_Dumitrascu Data 23 martie 2024 11:42:19
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>

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

list <int> g[100005];
int *grad;
stack <int> sol;
bool *viz;
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)
{
    for (auto it=g[a].begin(); it!=g[a].end(); it++) {
        if (*it==b) {
            g[a].erase(it);
            break;
        }
    }
    for (auto it=g[b].begin(); it!=g[b].end(); it++) {
        if (*it==a) {
            g[b].erase(it);
            break;
        }
    }
}
void pseudodfs (int nod)
{
    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;
        sterge_muchie(lnd, nd);
        sol.push(lnd);
        lnd=nd;

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

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