Cod sursa(job #3330843)

Utilizator ioanaaagioanaaag ioanaaag Data 22 decembrie 2025 16:39:55
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

const int NMAX = 100000;
const int MMAX = 500000;

int N, M;

vector<pair<int, int>> G[NMAX + 1];

vector<bool> vizitat(MMAX + 1, false);

vector<int> solutie;
// conex + toate nodurile au grad par
// toate muchiile sunt vizitate o singura data

// alg lui Fleury
// complexitate O(V+E)

void ReadInput() {
    ifstream fin("ciclueuler.in");
    fin >> N >> M;

    for(int i = 1; i <= M ; i ++) {
        int u, v;
        fin >> u >> v;
        // i = id al muchiei pentru a nu o folosi din nou 
        G[u].push_back({v, i});
        G[v].push_back({u, i});
    }
    fin.close();
}

void Euler(int nod) {
    while (!G[nod].empty()){
        pair<int, int> muchie = G[nod].back();
        G[nod].pop_back();

        int v = muchie.first;
        int id = muchie.second;

        if (vizitat[id] == false) {
            vizitat[id] = true;
            Euler(v);
        }
    }
    solutie.push_back(nod);
}

int main(){
    ReadInput();

    for(int i = 1; i <= N; i ++) {
        // daca nu are nr par de vecini => nu e eulerian 
        if (G[i].size() % 2 == 1){
            cout << -1 << endl;
            return 0;
        }
    }

    Euler(1);

    ofstream fout("ciclueuler.out");

    for (int i = 0; i < M; i ++){
        fout << solutie[i] << " ";
    }
    fout << endl;

    fout.close();

    return 0;
}