Pagini recente » Borderou de evaluare (job #2308170) | Cod sursa (job #2411272) | Borderou de evaluare (job #1718150) | Borderou de evaluare (job #2017137) | Cod sursa (job #3289194)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ( "ciclueuler.in" );
ofstream fout ( "ciclueuler.out" );
#define cin fin
#define cout fout
#define PB push_back
#define F first
#define S second
const int Nmax = 1e5 + 1;
typedef pair<int, int> pii;
int deg[Nmax];
vector<int> lista, cycle;
unordered_multiset<int> adj[Nmax];
void build_cycle() {
cycle.PB( 1 );
int u = *adj[1].begin();
adj[1].erase( adj[1].begin() );
auto it = adj[u].find( 1 );
adj[u].erase( it );
while( u != 1 ) {
cycle.PB( u );
int v = *adj[u].begin();
adj[u].erase( adj[u].begin() );
it = adj[v].find( u );
adj[v].erase( it );
u = v;
}
}
void next_vertex( int nod ) {
int u;
while( !adj[nod].empty() ) {
u = *adj[nod].begin();
cout << u << " ";
auto it = adj[u].find( nod );
adj[u].erase( it );
adj[nod].erase( adj[nod].begin() );
next_vertex( u );
}
}
int main()
{
int n, m, i, u, v, nod, last;
bool exista;
cin >> n >> m;
for( i = 0; i < m; i ++ ) {
cin >> u >> v;
adj[u].insert( v );
adj[v].insert( u );
deg[u]++;
deg[v]++;
}
exista = true;
for( i = 1; i < n + 1; i ++ )
if( deg[i] % 2 != 0 )
exista = false;
if( !exista )
cout << -1 << '\n';
else {
build_cycle();
for( i = 0; i < cycle.size(); i ++ ) {
cout << cycle[i] << " ";
next_vertex( cycle[i] );
}
}
return 0;
}