Pagini recente » Cod sursa (job #2925917) | Cod sursa (job #2651560) | Cod sursa (job #2043923) | Cod sursa (job #198717) | Cod sursa (job #3147308)
#include <stdio.h>
#include <vector>
const int MAXN = 1e5;
const int MAXM = 5e5;
std::vector<int> edges[MAXN];
int node_sum[MAXM];
bool viz[MAXM];
int ncyc;
int cycle[1 + MAXM];
int stack[MAXM];
int sp;
int edge_position[MAXN];
int main(){
FILE *fin = fopen( "ciclueuler.in", "r" );
FILE *fout = fopen( "ciclueuler.out", "w" );
int n, m, i, a, b, parity_check;
fscanf( fin, "%d%d", &n, &m );
for( i = 0 ; i < m ; i++ ){
fscanf( fin, "%d%d", &a, &b );
a--;
b--;
node_sum[i] = a + b;
viz[i] = false;
edges[a].push_back( i );
edges[b].push_back( i );
}
parity_check = true;
for( i = 0 ; i < n ; i++ ){
edge_position[i] = 0;
if( ((int)edges[i].size()) & 1 )
parity_check = false;
}
if( !parity_check ){
fputs( "-1\n", fout );
fclose( fin );
fclose( fout );
return 0;
}
ncyc = 0;
sp = 1;
stack[0] = 0;
while( sp ){
a = stack[sp - 1];
if( edge_position[a] < (int)edges[a].size() ){
b = edges[a][edge_position[a]++];
if( !viz[b] ){
viz[b] = true;
stack[sp++] = node_sum[b] - a;
}
}else{
cycle[ncyc++] = a;
sp--; // return
}
}
for( i = 1 ; i < ncyc ; i++ )
fprintf( fout, "%d ", 1 + cycle[i] );
fputc( '\n', fout );
fclose( fin );
fclose( fout );
return 0;
}