Pagini recente » Cod sursa (job #444846) | Cod sursa (job #3209898) | Cod sursa (job #2297079) | Monitorul de evaluare | Cod sursa (job #2770469)
#include <cstdio>
#include <algorithm>
#include <vector>
#define pb push_back
using namespace std;
FILE *fin = fopen( "ciclueuler.in", "r" );
FILE *fout = fopen( "ciclueuler.out", "w" );
const int MaxN = 100001;
const int MaxM = 500001;
struct vertex {
int edge, val;
};
vector<vertex> G[MaxN];
vector<int> cyc, s;
int viz[MaxN];
int eviz[MaxM];
int dfs( int node ) {
int num = 1;
viz[node] = 1;
for ( int i = 0; i < (int)G[node].size(); ++i ) {
if ( !viz[G[node][i].val] ) {
num += dfs( G[node][i].val );
}
}
return num;
}
int main() {
int n, m, x, y, node;
fscanf( fin, "%d%d", &n, &m );
for ( int i = 0; i < m; ++i ) {
fscanf( fin, "%d%d", &x, &y );
G[x].pb({ i, y });
G[y].pb({ i, x });
}
x = 1;
while ( x <= n && G[x].size() % 2 == 0 ) {
++x;
}
if ( x > n && dfs( 1 ) == n ) {
s.pb( 1 );
while ( !s.empty() ) {
node = s.back();
while ( G[node].size() && eviz[G[node].back().edge] ) {
G[node].pop_back();
}
if ( G[node].size() == 0 ) {
cyc.push_back( node );
s.pop_back();
} else {
eviz[G[node].back().edge] = 1;
s.pb( G[node].back().val );
}
}
for ( int i = 0; i < m; ++i ) {
fprintf( fout, "%d ", cyc[i] );
}
} else {
fprintf( fout, "-1" );
}
fclose( fin );
fclose( fout );
return 0;
}