Cod sursa(job #3344012)

Utilizator Dragu_AndiDragu Andrei Dragu_Andi Data 1 martie 2026 00:27:37
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax=1e5, mmax=5e5;
int n, m;
int ordine[nmax+1];
bool visited[nmax+1];
vector<pair<int,int>> G[nmax+1];
bool used[mmax];
queue<int> coada;
stack<int> stiva;
vector<int> ciclu;

bool conex()
{
    coada.push(1);
    int t;
    while(!coada.empty())
    {
        t=coada.front();
        coada.pop();
        visited[t]=true;
        for(pair<int,int> x: G[t])
            if(!visited[x.first])
                coada.push(x.first);
    }
    bool ans=1;
    for(int i=1; i<=n; i++)
        ans&=visited[i];
    return ans;
}

bool ordine_pare()
{
    bool ans=1;
    for(int i=1; i<=n; i++)
        ans&=(ordine[i]%2==0);
    return ans;
}

void find_cycle()
{
    stiva.push(1);
    int t;
    while(!stiva.empty())
    {
        t=stiva.top();
        while(!G[t].empty() && used[G[t].back().second])
            G[t].pop_back();
        if(!G[t].empty())
        {
            pair<int, int> muchie = G[t].back();
            G[t].pop_back();
            used[muchie.second]=true;
            stiva.push(muchie.first);
        }
        else
        {
            stiva.pop();
            ciclu.push_back(t);
        }
    }
}

int main()
{
    fin >> n >> m;
    int a, b;
    for(int i=0; i<m; i++)
    {
        fin >> a >> b;
        G[a].push_back({b,i});
        G[b].push_back({a,i});
        ordine[a]++;
        ordine[b]++;
    }
    if(!conex() || !ordine_pare())
    {
        fout << -1;
        return 0;
    }
    find_cycle();
    ciclu.pop_back();
    for(int x: ciclu)
        fout << x << ' ';
    return 0;
}