Cod sursa(job #3361256)

Utilizator Andrei_GAndreiG Andrei_G Data 22 iulie 2026 14:15:46
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#pragma GCC optimize("O3,unroll-loops")
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <iomanip>
#include <numeric>
#include <cstdio>
#include <bitset>
#include <string>
#include <vector>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#define int long long
//#define int short
using namespace std;

const int nmax = 1e5;
const int mmax = 5e5;

int n, m;
vector<pair<int, int>> adj[nmax + 5];
vector<bool> vis(mmax + 1, 0);

vector<int> euleriancycle(){
    stack<int> path;
    vector<int> cycle;
    path.push(1);
    while (!path.empty()){
        int currnode = path.top();
        while (!adj[currnode].empty() && vis[adj[currnode].back().second]){
            adj[currnode].pop_back();
        }
        if (!adj[currnode].empty()){
            int node = adj[currnode].back().first;
            vis[adj[currnode].back().second] = 1;
            adj[currnode].pop_back();
            path.push(node);
        }
        else{
            cycle.push_back(currnode);
            path.pop();
        }
    }
    reverse(cycle.begin(), cycle.end());
    cycle.pop_back();
    return cycle;
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
    cin>>n>>m;
    for (int i = 1; i <= m; i++){
        int u, v;
        cin>>u>>v;
        adj[u].push_back({v, i});
        adj[v].push_back({u, i});
    }
    for (int i = 1; i <= n; i++){
        if (adj[i].size() & 1){
            cout<<-1;
            return 0;
        }
    }
    vector<int> cycle = euleriancycle();
    for (auto& node : cycle){
        cout<<node<<" ";
    }
}