演算法整理 & 複習:尤拉圖
阿新 • • 發佈:2021-02-03
文章目錄
一、Hierholzer 演算法
① 對於全部偶數度數的圖來說,起始節點是任意的。
② 如果存在奇數點,那麼一定從奇數點開始。
③ 如果存在兩個奇數點,那麼一定從一個奇數點開始一個奇數點結束。
P2731 [USACO3.3]騎馬修柵欄 Riding the Fences
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAXN 505
int n, m, point=0x3f3f3f3f, cnt;
int ans[MAXN], in[MAXN];
int Map[MAXN][MAXN];
void dfs(int u)
{
for(int i=1;i<=m;i++)
{
if(Map[u][i])
{
Map[u][i]--;
Map[i][u]--;
dfs(i);
}
}
ans[++cnt] = u;
}
int main(void)
{
cin >> n;
for(int i=1;i<=n;i++)
{
int u,v;
cin >> u >> v;
m = max(m, max(u, v));
Map[u][v]++;
Map[v][u]++;
in[u]++;
in[v]++;
point = min(point, min(u, v));
}
for(int i=1;i<=m;i++)
{
if(in[i] & 1)
{
point = i;
break;
}
}
dfs(point);
for(int i=cnt;i>=1;i--)
cout << ans[i] << endl;
return 0;
}
二、Fleury 演算法
演算法流程:
- 任取 v 0 ∈ V ( G ) v_0\in V(G) v0∈V(G) ,令 P 0 = X 0 P_0 = X_0 P0=X0
- 設
p
i
=
v
0
e
1
v
1
e
2
⋯
e
i
v
i
p_i =v_0\ e_1\ v_1\ e_ 2\cdots e_i\ v_i
pi=v0e1v1e2⋯eivi 是已經遍歷過的邊,現在要從
E
(
G
)
−
(
e
1
e
2
e
3
⋯
e
i
)
E(G)-(e_1\ e_2\ e_3\cdots\ e_i)
E(G)−(e1e2e3⋯ei) 中選取
e
i
+
1
e_{i+1}
ei+1 ,選取規則如下:
- e i + 1 e_{i+1} ei+1 與 v i v_i vi 相連。
- 除非沒有別的邊可以走,否則 e i e_i ei 不應該是 G i = G − ( e 1 e 2 e 3 ⋯ e i ) G_i = G-(e_1\ e_2\ e_3\cdots\ e_i) Gi=G−(e1e2e3⋯ei) 的橋。
- 當第二部無法進行時,演算法停止。
從演算法的實現流程就可以看出,這個演算法效率低下,所以我就不寫了(其實是不會
返回