Cod sursa(job #2837387)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 22 ianuarie 2022 10:19:31
Problema Ciclu Eulerian Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <deque>
#include <vector>
#include <algorithm>

using namespace std;

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

/// eulerian era cel care parcurge toate muchiile grafului cu posibile repetari ale nodurilor

/// observatia care permite rezolvarea problemei
/// un ciclu eulerian se poate imparti in cicluri disjuncte

vector<int> m[100009] ;

vector<int> rez ;

void ciclue(int nod)
{
    if(nod == -1)return ;

    while(m[nod].size() && m[nod].back() == -1)m[nod].pop_back() ;

    if(!m[nod].size())return ;

    while(m[nod].size())
    {
        int next = m[nod].back() ;

        m[nod].pop_back() ;

        int indice = (upper_bound(m[next].begin(), m[next].end(), nod) - m[next].begin()) ;

        if(indice && m[next][indice - 1] == nod)m[next][indice - 1] = -1 ;

        ciclue(next) ;
    }

    rez.push_back(nod) ;
}

int main()
{
    int n, q ;

    cin >> n >> q ;

    while(q --)
    {
        int a, b ;

        cin >> a >> b ;

        m[a].push_back(b) ;
        m[b].push_back(a) ;
    }

    for(int f = 1 ; f <= n ; f ++)
        sort(m[f].begin(), m[f].end()) ;

    ciclue(1) ;

    cout << 1 << " " ;

    for(int f = 0 ; f < rez.size() - 1 ; f ++)
        cout << rez[f] << " " ;

    return 0;
}