Pagini recente » Cod sursa (job #2948841) | Statistici Eh... (Alexxxx) | Cod sursa (job #1511084) | Cod sursa (job #956750) | Cod sursa (job #2837502)
#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;
}