Cod sursa(job #3325977)

Utilizator rjytyjtjtjwee woo rjytyjtjtj Data 27 noiembrie 2025 09:16:49
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>
using namespace std;

ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");

vector<int> sol;

void dfs(int nod, vector<bool> &visN, vector<vector<pair<int, int>>> &graf){
    visN[nod] = true;

    for(auto nd : graf[nod]){
        if(!visN[nd.first]){                ///first este nodul in care merge muchia
            dfs(nd.first, visN, graf);
        }
    }
}


void euler(int node, vector<bool> &visM, vector<vector<pair<int, int>>> &graf){
    while(graf[node].size() > 0){
        int next_node = graf[node].back().first;  //nodul urmator
        int next_edge = graf[node].back().second; // muchia nodului urmator
        graf[node].pop_back(); // scapam de acel nod pentru a nu mai folosi muchia iar
        if(!visM[next_edge]){
           visM[next_edge] = true;
           euler(next_node, visM, graf);
        }
    }
    sol.push_back(node + 1);
}

int main(){
    int n, m;
    in >> n >> m;

    vector<int> grad(n);
    vector<vector<pair<int, int>>> graf(n); /// nodurile se salveaza ca (nod1 -> {nod2, i}), i fiind indicele muchiei citie, deoarece acestea nu sunt neaparat distincte
    for(int i = 0; i < m; i++){
        int x, y;
        in >> x >> y;

        grad[x-1]++;
        grad[y-1]++;

        graf[x-1].push_back({y-1, i});
        graf[y-1].push_back({x-1, i});
    }

    vector<bool> visN(n), visM(m);
    dfs(0, visN, graf);

    int ok = true;
    for(int i = 0; i < n; i++){
        if(!visN[i] || grad[i] % 2 == 1)
            ok = false;
    }

    if(!ok){
        out << -1;
        return 0;
    }

    euler(0, visM, graf);
    sol.pop_back(); //pentru a nu avea nodul de start de doua ori
    for(auto i : sol)
        out << i << " ";

}