Cod sursa(job #2924700)

Utilizator apocal1ps13Stefan Oprea Antoniu apocal1ps13 Data 8 octombrie 2022 19:56:16
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include<iostream>
#include<vector>
#include<stack>
#include<fstream>
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
const int nmax = 100000;
int n, m;
vector<pair<int, int>> g[nmax + 5];
bool visited[5 * nmax + 5];
int grad[nmax + 1];
vector<int>euler;
int main()
{
    in >> n >> m;
    int u, v;
    for (int i = 1; i <= m; i++)
    {
        in >> u >> v;
        g[u].push_back(make_pair(v, i));
        g[v].push_back(make_pair(u, i));
        grad[u]++;
        grad[v]++;
    }

    bool noCycle = false;
    for (int i = 1; i <= n; i++)
        if (grad[i] % 2) noCycle = true;

    if (noCycle == true) {
        out << -1;
        return 0;
    }
    stack<int>stiva;
    stiva.push(1);
    while (!stiva.empty()) {
        int node = stiva.top();
        while (!g[node].empty() && visited[g[node].back().second]) g[node].pop_back();
        if (g[node].empty()) stiva.pop(), euler.push_back(node);
        else stiva.push(g[node].back().first), visited[g[node].back().second] = 1;
    }
    for (int i = 0; i < euler.size() - 1; i++)
        out << euler[i] << ' ';
    return 0;
}