Cod sursa(job #2837498)

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

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<pair<int, int> > muchii ;

int frecv[500009] ;

vector<int> m[100009] ;

vector<int> rez ;

void ciclue(int nod)
{
    while(m[nod].size() && frecv[m[nod].back()])m[nod].pop_back() ;

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

    while(m[nod].size())
    {
        pair<int, int> muchia = muchii[m[nod].back()] ;

        int next = (muchia.first != nod) * muchia.first + (muchia.second != nod) * muchia.second + muchia.first * (muchia.first == muchia.second) ;

        frecv[m[nod].back()] = 1 ;

        m[nod].pop_back() ;

        ciclue(next) ;
    }

    rez.push_back(nod) ;
}

int main()
{
    int n, q ;

    cin >> n >> q ;

    int qq = q ;

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

        cin >> a >> b ;

        muchii.push_back({a, b}) ;

        m[a].push_back(muchii.size() - 1) ;
        m[b].push_back(muchii.size() - 1) ;
    }

    ciclue(1) ;

    if(rez.size() != q)
    {
        cout << -1 ;

        return 0 ;
    }

    cout << 1 << " " ;

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

    return 0;
}