题目:打印路径的欧拉回路[dfs实现]
1、在图G中任意找一个回路C
2、将图G中属于回路C的边删除
3、在残留图的各极大联通子图中分别寻找欧拉回路
4、将各极大联通子图的欧拉回路合并到C中得到图G的欧拉回路
/*
ID:daijinq1
PROG:fence
LANG:C++
*/
#include <iostream>
#include <cstdio>
using namespace std;
#define MAXN 520
int F;
int maxn, len;
int cnt[MAXN], stack[MAXN * 2], tu[MAXN][MAXN];
void input() {
int i, a, b;
for(cin>>F, i = 1; i <= F; ++i) {
cin>>a>>b;
++tu[a][b];
++tu[b][a];
++cnt[a];
++cnt[b];
maxn = max(a, max(maxn, b));
}
}
void dfs(int u) {
int v;
for(v = 1; v <= maxn; ++v)
if(tu[u][v]) {
tu[u][v]--;
tu[v][u]--;
dfs(v);
}
stack[len++] = u;
}
void solve() {
int i, s;
for(i = 1; i <= maxn; ++i)
if(cnt[i] & 1) {
s = i;
break;
}
dfs(s);
}
void output() {
int i;
for(i = len - 1; i >= 0; --i)
cout<<stack[i]<<endl;
}
int main() {
freopen("fence.in", "r", stdin);
freopen("fence.out", "w", stdout);
input();
solve();
output();
return 0;
}