Pagini recente » Cod sursa (job #2671438) | Cod sursa (job #301891) | Cod sursa (job #1907967) | Cod sursa (job #2216616) | Cod sursa (job #1134165)
/*#include <stdio.h>
#include <fstream>
#include <list>
#include <stack>
#include <queue>
#define nmax 500001
#define NMAX 100001
using namespace std;
int N, M;
list <int> G[nmax];
int deg[NMAX];
queue <int> q;
bool viz[NMAX];
stack <int> S;
list <int> L;
int BFS (int v) {
int count, x, y;
q.push(v);
viz[v] = 1;
count = 1;
while (!q.empty()) {
x = q.front();
q.pop();
for (typeof(G[x].begin()) it = G[x].begin(); it != G[x].end(); ++it) {
y = *it;
if (!viz[y]) viz[y] = 1, ++count, q.push(y);
}
}
if (count == N) return 1;
return 0;
}
int eulerian () {
for (int i = 1; i <= N; ++i)
if (deg[i] % 2 != 0) return 0;
return 1;
}
void sterge (int v, int w) {
--deg[v], --deg[w];
G[v].pop_front();
for (typeof (G[w].begin()) it = G[w].begin(); it != G[w].end(); ++it)
if (*it == v) {
G[w].erase(it);
break;
}
}
void euler (int v) {
while (true) {
if (G[v].empty())
break;
int w = G[v].front();
S.push(v);
sterge (v, w);
v = w;
}
}
int main() {
freopen ("ciclueuler.in", "r", stdin);
freopen ("ciclueuler.out", "w", stdout);
int i, x, y, ok, v;
scanf ("%d %d", &N, &M);
for (i = 1; i <= M; ++i) {
scanf ("%d %d", &x, &y);
++deg[x];
++deg[y];
G[x].push_back(y);
G[y].push_back(x);
}
while (true) {
if (!BFS(1)) {
printf ("-1\n");
break;
}
if (!eulerian()) {
printf ("-1\n");
break;
}
v = 1;
do {
euler( v );
v = S.top(); S.pop();
L.push_back (v);
} while(!S.empty());
for (typeof (L.begin()) it = L.begin(); it != L.end(); ++it)
printf ("%d ", *it);
printf ("\n");
break;
}
return 0;
}
*/
#include <fstream>
#include <list>
#include <stack>
#include <queue>
using namespace std;
#define TR( C, it ) \
for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )
#define pb push_back
#define NX 100010
list< int > G[ NX ], L;
stack< int > S;
queue< int > Q;
int N, M, deg[ NX ], col[ NX ];
void cit() {
int u, v;
scanf( "%d%d", &N, &M );
while( M-- ) {
scanf( "%d%d", &u, &v );
G[u].pb( v ); deg[u]++;
G[v].pb( u ); deg[v]++;
}
}
void BFS( int v ) {
Q.push( v ); col[v] = 1;
while( !Q.empty() ) {
v = Q.front(); Q.pop();
TR( G[v], w )
if( col[ *w ] == 0 )
Q.push( *w ), col[ *w ] = 1;
}
}
int este_conex() {
BFS( 1 );
for( int v = 2; v <= N; v++ )
if( col[ v ] == 0 )
return 0;
return 1;
}
int eulerian() {
if( este_conex() == 0 )
return 0;
for( int v = 1; v <= N; v++ )
if( deg[ v ] % 2 == 1 )
return 0;
return 1;
}
void sterge( int v, int w ) {
deg[v]--, deg[w]--;
G[v].pop_front();
TR( G[w], it )
if( *it == v ) {
G[w].erase( it );
break;
}
}
void euler( int v ) {
while( true ) {
if( G[v].empty() )
break;
int w = G[v].front();
S.push( v );
sterge( v, w );
v = w;
}
}
int rez() {
int v = eulerian();
if( v == 0 )
return -1;
do {
euler( v );
v = S.top(); S.pop();
L.pb( v );
} while( !S.empty() );
return 1;
}
void scr( int x ) {
if( x == -1 )
printf( "-1\n" );
else {
TR( L, v )
printf( "%d ", *v );
printf( "\n" );
}
}
int main() {
freopen( "ciclueuler.in", "r", stdin );
freopen( "ciclueuler.out", "w", stdout );
cit();
scr( rez() );
return 0;
}