Cod sursa(job #3226434)

Utilizator Toni07Stoica Victor Toni07 Data 21 aprilie 2024 13:57:44
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ("ciclueuler.in");
ofstream g ("ciclueuler.out");

const int nmax = 1e6+5, mmax = 5 * nmax;
int n, m, st[mmax], dr[mmax], sol[nmax];
bool viz[mmax], viz2[nmax];
vector <int> L[nmax];

inline void dfs2(int nod){
    viz2[nod]=true;
    for(auto it : L[nod])
        if(!viz2[st[it] + dr[it] - nod])
            dfs2(st[it] + dr[it] - nod);
}
inline bool conex(){
    dfs2(1);
    for(int i = 1; i <= n; ++i)
        if(!viz2[i])
            return false;
    return true;
}

bool euler() {
    if(!conex()) return false;
    for(int i = 1; i <= n; ++i)
        if(L[i].size() & 1)
            return false;
    return true;
}

void dfs(int nod) {
    for(auto it : L[nod])
        if(!viz[it]){
            viz[it] = true;
            dfs(st[it] + dr[it] - nod);
        }
    sol[++sol[0]] = nod;
}

int main()
{
    f >> n >> m;
    for (int i = 1; i <= m; ++i) {
        f >> st[i] >> dr[i];
        L[st[i]].push_back(i);
        L[dr[i]].push_back(i);
    }
    if(!euler()) g << "-1";
    else {
        dfs(1);
        for(int i = 1;i < sol[0]; ++i) g << sol[i] << " ";
    }
    return 0;
}