Pagini recente » Cod sursa (job #1341834) | Cod sursa (job #1512670) | Cod sursa (job #62302) | Cod sursa (job #70396) | Cod sursa (job #1438588)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <bitset>
#include <stack>
using namespace std;
#define Nmax 100002
FILE *f = fopen ( "ciclueuler.in", "r" );
FILE *g = fopen ( "ciclueuler.out", "w" );
vector < int > G[Nmax];
stack < int > st, ciclu;
bool viz[Nmax];
int grad[Nmax], N, M, visited = 0;
void Conex ( int nod ){
vector < int > :: iterator it;
viz[nod] = 1;
visited++;
for ( it = G[nod].begin(); it < G[nod].end(); ++it ){
if ( !viz[*it] )
Conex ( *it );
}
}
bool Eulerian(){
for ( int i = 1; i <= N; ++i )
if ( grad[i] & 1 )
return 0;
Conex( 1 );
if ( visited != N )
return 0;
return 1;
}
void Sterge ( int x, int y ){
vector < int > :: iterator it;
for ( it = G[x].begin(); it < G[x].end(); ++it ){
if ( *it == y ){
G[x].erase(it);
break;
}
}
for ( it = G[y].begin(); it < G[y].end(); ++it ){
if ( *it == x ){
G[y].erase(it);
break;
}
}
}
void Euler ( int nod ){
int aux;
vector < int > :: iterator it;
while ( !G[nod].empty() ){
it = G[nod].begin();
st.push( nod );
aux = *it;
Sterge ( nod, aux );
nod = aux;
}
}
void Afisare(){
while ( !ciclu.empty() ){
fprintf ( g, "%d ", ciclu.top() );
ciclu.pop();
}
}
int main(){
vector < int > :: iterator it;
int x, y;
fscanf ( f, "%d%d", &N, &M );
for ( int i = 1; i <= M; ++i ){
fscanf ( f, "%d%d", &x, &y );
G[x].push_back ( y );
G[y].push_back ( x );
grad[x]++;
grad[y]++;
}
if ( !Eulerian() ){
fprintf ( g, "-1" );
return 0;
}
int nod = 1;
do{
Euler( nod );
nod = st.top();
st.pop();
ciclu.push ( nod );
}while ( !st.empty() );
Afisare();
return 0;
}