Cod sursa(job #3303848)

Utilizator Luca_georgescuLuca Georgescu Luca_georgescu Data 18 iulie 2025 13:07:02
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax=500005;
vector < multiset<int> > gr(nmax);
vector <int> euler;
int viz[nmax],x,y,n,m;

void dfs(int nod)
{
    viz[nod]=true;
    for (int vec:gr[nod] )
        if ( !viz[vec] )
           dfs(vec);
}

bool is_eulerian(int n)
{
    for (int i=1; i<=n; i++ )
        if ( gr[i].size()%2!=0 )
            return false;

    int start=1;
    while ( gr[start].empty() && start<=n )
        start++;

    dfs(start);

    for (int i=1; i<=n; i++ )
        if ( !gr[i].empty() && !viz[i] )
            return false;

    return true;
}

void euler_cycle(int start)
{
    stack <int> st;
    st.push(start);

    while ( !st.empty() )
    {
        int nod=st.top();

        if ( !gr[nod].empty() )
        {
            int next=*gr[nod].begin();
            gr[nod].erase(gr[nod].find(next));
            gr[next].erase(gr[next].find(nod));

            st.push(next);
        }
        else
        {
            euler.push_back(nod);
            st.pop();
        }
    }
}

int main()
{
    f >> n >> m;
    for (int i=1; i<=m; i++ )
    {
        f >> x >> y;
        gr[x].insert(y);
        gr[y].insert(x);
    }

    if ( is_eulerian(n) )
    {
        int start=1;
        while ( gr[start].empty() && start<=n )
            start++;

        euler_cycle(start);

        for (int i=0; i<euler.size(); i++ )
            g << euler[i] << " ";
    }
    return 0;
}