Cod sursa(job #2790857)

Utilizator Bogdan.paun50Mandresi Bogdan Bogdan.paun50 Data 29 octombrie 2021 17:43:13
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.18 kb
#include <bits/stdc++.h>
using namespace std;

const int DIM = 100005;

// in lista de vecini retin perechi de forma (vecin, indexul muchiei catre
// vecin)
int idx_muchie = 0;
vector<pair<int, int>> g[DIM];
bool deleted[5 *
             DIM];  // deleted[i] == true <=> muchia cu indexul i a fost stearsa

vector<int> sol;

int grad[DIM];
bool vis[5 * DIM];  // muchiile deja vizitate
int nr_muchii = 0;

void dfs(int nod) {
    for (pair<int, int> e : g[nod]) {
        if (!vis[e.second]) {  // daca muchia nu a fost deja vizitata mergi pe
                               // ea
            nr_muchii++;
            vis[e.second] = true;
            dfs(e.first);
        }
    }
}

void euler(int nod) {
    for (int i = g[nod].size() - 1; i >= 0; --i) {
        int vecin = g[nod][i].first;
        int muchie = g[nod][i].second;
        g[nod].pop_back();  // putem deja sterge muchia din lista de vecini a
                            // lui nod
        if (!deleted[muchie]) {  // daca muchia nu a fost stearsa anterior de
                                 // vecin putem merge pe ea
            deleted[muchie] = true;
            euler(vecin);
        }
    }
    sol.push_back(nod);
}

int main() {
#ifdef LOCAL
    ifstream cin("a.in");
    ofstream cout("a.out");
#else
    ifstream cin("ciclueuler.in");
    ofstream cout("ciclueuler.out");
#endif

    int N, M;
    cin >> N >> M;
    for (int i = 1; i <= M; ++i) {
        int x, y;
        cin >> x >> y;
        idx_muchie++;  // actualizez indexul curent al muchiei
        g[x].push_back(make_pair(y, idx_muchie));
        g[y].push_back(make_pair(x, idx_muchie));

        grad[x]++;
        grad[y]++;
    }

    for (int i = 1; i <= N; ++i) {
        if (grad[i] % 2 == 1) {
            cout << "-1\n";
            return 0;
        }
    }

    // cautam un nod neizolat
    int sursa = 1;
    while (grad[sursa] == 0) sursa++;

    dfs(sursa);
    if (nr_muchii != M) {
        cout << "-1\n";
        return 0;
    }

    euler(sursa);

    sol.pop_back();  // nodul de start/end e acelasi
    for (int x : sol) {
        cout << x << " ";
    }
    cout << "\n";
}