Pagini recente » Cod sursa (job #2000492) | Cod sursa (job #2682141) | Cod sursa (job #1432732) | Cod sursa (job #1263617) | Cod sursa (job #1337450)
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <utility>
using namespace std;
#define Nmax 100002
FILE *f = fopen ( "ciclueuler.in", "r" );
FILE *g = fopen ( "ciclueuler.out", "w" );
vector < int > G[Nmax];
stack < int > S, sol;
queue < int > Q;
int N, M, visited, grad[Nmax];
bool inQ[Nmax], viz[Nmax];
void BFS ( int start ){
int nod;
vector < int > :: iterator it;
Q.push( start );
inQ[start] = 1;
while ( !Q.empty() ){
nod = Q.front();
Q.pop();
viz[nod] = 1; visited++;
inQ[nod] = 0;
for ( it = G[nod].begin(); it < G[nod].end(); ++it )
if ( !viz[*it] && !inQ[*it] ){
Q.push( *it );
inQ[*it] = 1;
}
}
}
bool eulerian (){
for ( int i = 1; i <= N; ++i )
if ( grad[i] & 1 )
return 0;
return 1;
}
void sterge ( int x, int y ){
vector < int > :: iterator it;
grad[x]--;
grad[y]--;
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();
S.push ( nod );
sterge ( nod , aux = *it );
nod = aux;
}
}
void afisare (){
while ( !sol.empty() ){
fprintf ( g, "%d ", sol.top() );
sol.pop();
}
}
int main(){
int x, y, nod;
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]++;
}
BFS ( 1 );
if ( visited == N && eulerian () ){
do {
Euler( 1 );
nod = S.top();
S.pop();
sol.push ( nod );
} while( !S.empty() );
afisare();
}
else
fprintf ( g, "-1" );
return 0;
}