Cod sursa(job #2699225)

Utilizator Ionut2791Voicila Ionut Marius Ionut2791 Data 23 ianuarie 2021 21:31:07
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <bits/stdc++.h>
#define ll unsigned long long
#define sz(v) (int)v.size()
#define fin cin
#define readFast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;

const int NMAX = 1e5 + 5;
vector<set<int>> graf(NMAX);
vector<int> ciclu[NMAX];
int n, m;
bool ok = false;

void dfs(int nod, int p) {
    if(nod == 1) {
        ok = true;
        return;
    }

    if(sz(graf[nod]) != 2) {
        return;
    }

    for (int to : graf[nod]) {
        if(to == p)
            continue;
        dfs(to, nod);
    }
}

void afis(int nod, int p) {
    fout << nod << " ";

    for (int aux : ciclu[nod]) {
        if(aux == nod)
            fout << aux << " ";
        else
            fout << aux << " " << nod << " ";
    }
    if(nod == 1)
        return;

    for (int to : graf[nod]) {
        if(to == p)
            continue;

        afis(to, nod);
    }
}

int main() {
    //ifstream fin("date.in.txt");
    ifstream fin("ciclueuler.in");
    ofstream fout("ciclueuler.out")
    fin >> n >> m;
    for (int i = 1; i <= m; ++i) {
        int a, b;
        fin >> a >> b;
        if(a == b) {
            ciclu[a].push_back(b);
            continue;
        }

        if(graf[a].find(b) != graf[a].end()) {
            graf[a].erase(b);
            graf[b].erase(a);

            ciclu[a].push_back(b);
            ciclu[b].push_back(a);
            continue;
        }
        if(graf[b].find(a) != graf[b].end()) {
            graf[a].erase(b);
            graf[b].erase(a);

            ciclu[b].push_back(a);
            ciclu[a].push_back(b);
            continue;
        }

        graf[a].insert(b);
        graf[b].insert(a);
    }

    if(graf[1].empty()) {
        for (int nr : ciclu[1]) {
            if(nr == 1)
                fout << nr << " ";
            else
                fout << 1 << " " << nr << " ";
        }
        return 0;
    }
    else
        dfs(*graf[1].begin(), 1);

    if(ok)
        afis(*graf[1].begin(), 1);
    else
        fout << -1;

    return 0;
}