Pagini recente » Cod sursa (job #2739296) | Cod sursa (job #3271622) | Cod sursa (job #2081080) | Cod sursa (job #2305125) | Cod sursa (job #2691901)
#include <cstdio>
#include <algorithm>
#include <cctype>
#include <stack>
#include <vector>
using namespace std;
FILE *fin = fopen( "ciclueuler.in", "r" );
FILE *fout = fopen( "ciclueuler.out", "w" );
const int MaxN = 100001;
vector<int> G[MaxN];
vector<int> cyc;
stack<int> s;
int deg[MaxN];
int vis[MaxN];
static inline void delEdge( int x, int y ) {
int i = 0;
G[y].pop_back();
while ( G[x][i] != y ) {
++i;
}
swap( G[x][i], G[x].back() );
G[x].pop_back();
}
int DFS( int node ) {
int num = 1;
vis[node] = 1;
for ( int i = 0; i < (int)G[node].size(); ++i ) {
if ( !vis[G[node][i]] ) {
num += DFS( G[node][i] );
}
}
return num;
}
int getNum() {
int n = 0;
char ch;
while ( isspace( ch = fgetc( fin ) ) );
do {
n = n * 10 + ch - '0';
} while ( isdigit( ch = fgetc( fin ) ) );
return n;
}
void giveNum( int n ) {
int m = n, p = 10;
while ( m > 9 ) {
p *= 10;
m /= 10;
}
p /= 10;
while ( p > 0 ) {
fputc( n / p + '0', fout );
n %= p;
p /= 10;
}
fputc( ' ', fout );
}
int main() {
int n, m, x, y, node;
n = getNum();
m = getNum();
for ( int i = 0; i < m; ++i ) {
x = getNum();
y = getNum();
G[x].push_back( y );
G[y].push_back( x );
++deg[x];
++deg[y];
}
node = 1;
while ( node <= n && !(deg[node] & 1) ) {
++node;
}
if ( node > n && DFS( 1 ) == n ) {
s.push( 1 );
while ( !s.empty() ) {
node = s.top();
if ( G[node].size() == 0 ) {
cyc.push_back( node );
s.pop();
} else {
s.push( G[node].back() );
delEdge( G[node].back(), node );
}
}
for ( int i = 0; i < m; ++i ) {
giveNum( cyc[i] );
}
} else {
fputc( '-', fout );
fputc( '1', fout );
}
fclose( fin );
fclose( fout );
return 0;
}