Pagini recente » Cod sursa (job #2036613) | Cod sursa (job #19072) | Cod sursa (job #1712249) | Cod sursa (job #311860) | Cod sursa (job #2837489)
#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 ;
while(q --)
{
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) ;
cout << 1 << " " ;
for(int f = 0 ; f < rez.size() - 1 ; f ++)
cout << rez[f] << " " ;
return 0;
}