Cod sursa(job #3330789)

Utilizator DragosC1Dragos DragosC1 Data 22 decembrie 2025 08:28:59
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>
#include <fstream>

using namespace std;

const int NMAX = 100'000;
const int MMAX = 500'000;

vector<pair<int, int>> G[NMAX + 1];  // lista de adiancenta + indexul muchii 
bool viz[MMAX + 1]; // marcheaza daca am vizitat o muchie sau nu

int N, M;

ofstream g("ciclueuler.out");

void ReadInput() {
    ifstream f("ciclueuler.in");
    f >> N >> M;
    for (int i = 1; i <= M; i++) {
        int x, y;
        f >> x >> y;
        G[x].push_back({y, i});
        G[y].push_back({x, i});
    }
    f.close();
}

vector<int> ciclu_eulerian;

void dfs(int nod) {
    // Algoritmul lui Fleury
    while (G[nod].size() > 0) {
        pair<int, int> muchie = G[nod].back();
        G[nod].pop_back(); // setergem ultima muchie
        int nod_vecin = muchie.first;
        int ind_muchie = muchie.second;
        if (viz[ind_muchie])
            continue;
        viz[ind_muchie] = 1;
        dfs(nod_vecin);
        ciclu_eulerian.push_back(nod_vecin);
    }
}

void FindEulerCycle() {
    for (int i = 1; i <= M; i++)    
        viz[i] = 0; // nici o muchie nu e vizitata
    ciclu_eulerian.clear();
    dfs(1);
    for (int i = 1; i <= M; i++)
        if (!viz[i]) {
            g << -1 << '\n';
            return;
        }
    reverse(ciclu_eulerian.begin(), ciclu_eulerian.end());
    for (int i = 0; i < ciclu_eulerian.size(); i++)
        g << ciclu_eulerian[i] << ' ';
}

int main() {
    ReadInput();
    // Determinam daca graful G este Eulerian -> verificam daca nodurile au grad par
    for (int i = 1; i <= N; i++)
        if (G[i].size() % 2 != 0) {
            // nod cu grad impar
            g << -1 << '\n';
            exit(0);
        }
    FindEulerCycle();
    return 0;
}