在求解欧拉回路的问题中我们可以采用fleury算法。
然而在进行算法竞赛时,如果只是求欧拉回路我们可以采用DFS进行实现,需要注意的小细节时在输出边时需要在回溯阶段逆向输出因为遇到 1->2->3->2->1这种图会出现走死路情况
来看道例题:
UVA10054
#include <bits/stdc++.h> using namespace std; const int N = 55; int g[N][N]; int d[N]; int n; void euler(int u) { for(int v = 1; v <= 50; ++v){ if(g[u][v]) { g[u][v]--; g[v][u]--; euler(v); printf("%d %d ", v, u); //一定是逆序输出 } } } int main () { int T; scanf("%d", &T); for(int t = 1; t <= T; ++t) { int u, v; memset(g, 0, sizeof g); memset(d, 0, sizeof d); scanf("%d", &n); for(int i = 1; i <= n; ++i){ scanf("%d%d", &u, &v); d[u]++; d[v]++; g[u][v]++; g[v][u]++; } printf("Case #%d ", t); bool is = 1; for(int j = 1; j <= 50; ++j) { if(d[j] % 2) { is = 0; break; } } if(!is) { // printf("some heads may be lost "); printf("some beads may be lost "); } else { for(int i = 1; i <= 50; ++i) { euler(i); } } if(t != T) { printf(" "); } } }