Pagini recente » Cod sursa (job #2795593) | Cod sursa (job #3283817) | Cod sursa (job #2506516) | Cod sursa (job #2331950) | Cod sursa (job #1813444)
/**
* Program that determines wether a given multigraph
* is eulerian or not. Prints :
*
* (a) A nodes sequence that determines the
* eulerian cycle if it is one
* (b) -1 if it is not
*
* EUCLIDIAN CYCLE = a cycle where every edge
* is visited only once
*
* Created by Tudor Avram on 22/11/16.
*/
#include<cstdio>
#include<vector>
#include<list>
#define N_MAX 100001
#define pb push_back
#define iterator vector<int>::iterator
using namespace std;
vector<int> G[N_MAX];
list<int> Q;
void Solve(int node) {
Q.pb(node);
while (!Q.empty()) {
int src = Q.front();
if (G[src].empty()) {
Q.pop_front();
printf("%d ", src);
} else {
int dest = G[src].back();
Q.push_front(dest);
G[src].pop_back();
for (iterator it = G[dest].begin(); it!=G[dest].end(); it++) {
if (*it == src) {
G[dest].erase(it);
break;
}
}
}
}
}
bool read_data() {
int N, M;
scanf("%d%d", &N, &M);
for (int i = 1; i <= M; i++) {
int x,y;
scanf("%d%d", &x, &y);
G[x].pb(y);
G[y].pb(x);
}
for (int i = 1; i <= N; i++) {
if (G[i].size() % 2 == 1) {
// we can't have a Eulerian cycle
return false;
}
}
return true;
}
int main() {
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
bool possible = read_data();
if (possible) Solve(1);
else printf("-1\n");
fclose(stdin);
fclose(stdout);
return 0;
}