Cod sursa(job #3336707)

Utilizator CalinHanguCalinHangu CalinHangu Data 25 ianuarie 2026 14:17:35
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <vector>
#define pii pair<int, int>

using namespace std;

const int NMAX = 1e5 + 5;
const char nl = '\n';

vector<pii> graph[NMAX]; // (neigh, index edge) pentru a putea identifica unic fiecare muchie
int visited[NMAX];
vector<int> cycle;
int length; // numaram cate noduri au fost adaugate ca sa nu mai afisam la sf ultimul nod

bool check_degrees() {
    for(auto neigh: graph) {
        if(neigh.size() % 2 != 0) {
            return false;
        }
    }

    return true;
}

void euler(int node) {
    while(!graph[node].empty()) {
        int neigh = graph[node].back().first;
        int index = graph[node].back().second;
        graph[node].pop_back();

        if(!visited[index]) {
            visited[index] = 1;
            euler(neigh);
        }

    }
    length++;
    cycle.push_back(node);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);

    int n, m;
    cin >> n >> m;

    for(int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;

        graph[u].push_back({v, i});
        graph[v].push_back({u, i});
    }

    if(check_degrees()) {
        euler(1);

        while(length-- && length > 1) {
            cout << cycle.back() << ' ';
            cycle.pop_back();
        }

    } else {
        cout << -1 << nl;
    }
    return 0;
}