Pagini recente » Cod sursa (job #1428834) | Cod sursa (job #3196262) | Cod sursa (job #408406) | Cod sursa (job #2408992) | Cod sursa (job #2572362)
#include <fstream>
#include <vector>
#define N 100001
using namespace std;
ifstream f ( "ciclueuler.in" );
ofstream g ( "ciclueuler.out" );
vector < pair < int, int > > graph[N];
int start[N], cicle[N], euler[N], n, m, x, y, k, p, i, gr[N], nr;
bool viz[N];
int main()
{ f >> n >> m;
for ( i = 1; i <= m; i++ ){
f >> x >> y;
graph[x].push_back ( { y, i } );
graph[y].push_back ( { x, i } );
gr[x]++, gr[y]++;
}
cicle[k = 1] = 1;
for ( i = 1; i <= n; i++ )
if ( gr[i] % 2 == 1 )
nr++;
if ( nr > 2 ){
g << -1;
return 0;
}
while ( k != 0 ){
while ( gr[cicle[k]] == 0 && k > 0 ){
euler[++p] = cicle[k];
k--;
}
if ( k > 0 ){
int node = cicle[k];
while ( start[node] < graph[node].size ( ) ){
int new_node = graph[node][start[node]].first;
int arc_num = graph[node][start[node]].second;
if ( viz[arc_num] == 0 ){
cicle[++k] = new_node;
viz[arc_num] = 1;
gr[node]--, gr[new_node]--;
break;
}
start[node]++;
}
}
}
if ( p == m + 1 )
for ( i = 1; i <= p; i++ )
g << euler[i] << ' ';
else
g << -1;
return 0;
}