1. 程式人生 > 其它 >演算法整理 & 複習:尤拉圖

演算法整理 & 複習:尤拉圖

技術標籤:資料結構與演算法演算法歐拉回路圖論

文章目錄




一、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 演算法


演算法流程:

  1. 任取 v 0 ∈ V ( G ) v_0\in V(G) v0V(G) ,令 P 0 = X 0 P_0 = X_0 P0=X0
  2. 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=v0e1v1e2eivi 是已經遍歷過的邊,現在要從 E ( G ) − ( e 1 e 2 e 3 ⋯ e i ) E(G)-(e_1\ e_2\ e_3\cdots\ e_i) E(G)(e1e2e3ei) 中選取 e i + 1 e_{i+1} ei+1 ,選取規則如下:
    1. e i + 1 e_{i+1} ei+1 v i v_i vi 相連。
    2. 除非沒有別的邊可以走,否則 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(e1e2e3ei) 的橋。
  3. 當第二部無法進行時,演算法停止。

從演算法的實現流程就可以看出,這個演算法效率低下,所以我就不寫了(其實是不會






返回