Pagini recente » Cod sursa (job #2633413) | Cod sursa (job #1448805) | Cod sursa (job #854482) | Cod sursa (job #1767729) | Cod sursa (job #2837387)
#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;
}