Pagini recente » Cod sursa (job #2903722) | Cod sursa (job #1442890) | Cod sursa (job #2222972) | Cod sursa (job #2878643) | Cod sursa (job #2681388)
#include <fstream>
#include <algorithm>
#include <stack>
#include <vector>
using namespace std;
ifstream fin( "ciclueuler.in" );
ofstream fout( "ciclueuler.out" );
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 < G[node].size(); ++i ) {
if ( !vis[G[node][i]] ) {
num += DFS( G[node][i] );
}
}
return num;
}
int main() {
int n, m, x, y, node;
fin >> n >> m;
for ( int i = 0; i < m; ++i ) {
fin >> x >> y;
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 ) {
fout << cyc[i] << " ";
}
} else {
fout << "-1\n";
}
fin.close();
fout.close();
return 0;
}