generalliu
最小生成樹
就是在乙個 n 個點的連通圖里
取 n-1 條邊
使 n 個點 連通
並且 這 n-1 條邊 的和 最小
如 紅邊 是 最小生成樹
最小生成樹 主要就是通過 下面的兩種方法
prim演算法 和 kruskal演算法 來解決
然後 這兩種演算法 採用的思路 不同
但是 到達同樣的 結果
具體選擇
可以根據題目的 特點 或者 個人喜好
我個人覺得 k演算法 寫起來很爽
但理性地講
p演算法 的複雜度 主要取決於 節點數
k演算法 的複雜度 主要取決於 邊數
所以 當點一樣多時 比較稀疏(邊少)的圖 用 k演算法
比較稠密(邊多)的圖 用 p演算法
kruskal演算法
兩步就能解決的
相當容易理解的
個人情有獨鍾的
k演算法兩步
既然最小生成樹 一定要取 n-1 條邊
那麼 取邊的時候 就 能小則小 嘍
所以 第一步
將所有的邊 按邊權 從小到大排序
過第二步
選邊的時候 很明顯地 「 選前 n-1 條邊」 是錯的
所以 從小到大 能選則選 直到選了 n-1 條為止
第二步過
簡單的要死
注釋所謂 「能選則選」 :
因為 最小生成樹 是樹 是沒有環的
所以 選邊的時候也不能出現 環
每次成功 選出一條邊 就把 邊連線的兩個連通塊 合併
所謂 「 成功 選出 」:
該邊的 兩個端點 不在同一連通塊裡
如果在同乙個連通塊裡 就成環了
**
#include usingview codenamespace
std;
const
int maxn=100000+15
;const
int maxm=100000+15
;struct
edge
edge[maxm];
intn,m,tot;
//由小到大
bool
cmp(edge a,edge b)
inttop[maxn];
//判斷連通塊 的 時候 用到了 並查集
int found(int
x)
intmain()
sort(edge+1,edge+m+1,cmp); //
第一步 排序
for (int i=1;i<=n;i++) top[i]=i; //
初始化 連通塊
int ans=0
;
for (int i=1;tot;i++)
}printf(
"%d\n
",ans);
return0;
}
prim演算法
先選取乙個 藍點
然後不斷 把白點 加入藍點 的乙個過程
1 初始化 v』= e』={} v'是藍點
x是隨便乙個節點
2 重複下列操作 直到v』=v
在e集合當中 選擇最小的邊
使得 u∈v』 但是 v∉v』 u是藍點 v是白點
v』 中加入節點 v e』 中加入
3 (v』,e』)則為所求的最小生成樹。
分析1 中 的 x 隨便 乙個點 即可
2 一直 選最小的 連線 v' 與 !v』 的 邊
這一步可用 heap 堆 (優先佇列) 優化
維護乙個 u∈v』 但是 v∉v』 的邊集
就能 迅速取出 滿足要求 的邊
**
#include usingview codenamespace
std;
const
int maxn=100000+15
;const
int maxm=100000+15
;struct
edge
}edge[maxm*2
];const
bool
operator
< (const edge &a,const edge &b)//
定義 小根堆
intn,m;
intsumedge,head[maxn];
int ins(int x,int y,int
z)priority_queue
que;
intans;
bool
boo[maxn];
intmain()
memset(boo,
false,sizeof(boo)); //
初始 全為 白點
boo[1]=true; //
1 置為藍點
for (int u=head[1];u;u=edge[u].next) que.push(edge[u]);//
堆中加邊
for (int i=1;i//
總共要取出 n-1 條邊
printf(
"%d\n
",ans);
return0;
}
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...
最小生成樹
package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...
最小生成樹
define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...