Cod sursa(job #2837363)

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

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() ;

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

        m[nod].pop_back() ;

        for(int f = 0 ; f < m[next].size() ; f ++)
            if(m[next][f] == nod){m[next][f] = -1 ; break ;}

        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) ;
    }

    ciclue(1) ;

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

    return 0;
}