給定乙個無向圖(頂點間連線不帶方向),如果它任意兩個頂點都聯通並且是一棵樹,那麼我們就稱之為生成樹(spanning tree)
如果是帶權值的無向圖,那麼權值之和最小的生成樹,我們就稱之為最小生成樹(mst, minimum spanning tree)
最小生成樹廣泛應用於城市間道路建設的優化,通訊網路最優鋪設等,將網路站點或者城市看成無向圖中的頂點,把每條道路、網線的成本作為權值,從而計算出建設的最小成本
kruskal 是基於貪心的最小生成樹實現演算法,通過將所有邊的權值排序,按從小到大的順序取出,如果邊的端點不屬於同乙個集合(未聯通,該道路需要建設),那麼將這兩個端點所屬的兩個集合合併(建設道路後,端點聯通),直到所有點屬於乙個集合為止
為了高效查取端點的集合歸屬,用到了並查集,可以說 kruskal是基於並查集的貪心演算法
並查集傳送門:資料結構-並查集
a.起始時每個頂點作為單元素集合
b.對所有邊按權值(成本)進行排序
c.按小到大順序,取出邊(u,v),如果u v 不屬於同一集合,將u,v 所屬集合合併
d.重複c,直到所有邊遍歷完,或者所有頂點連通:假設有m個點,合併的邊數n,最優連通的充要條件 n=m-1
#include#includeusing namespace std;
#define max_size 105
struct road //邊
};road road_list[max_size];
int village[max_size]; //頂點
int rank[max_size]; //記錄高度
void init(int n) //初始化}
int find(int x) //查詢根
return root;
}int combine(int a,int b)
return 1;
}int kruskal(int n,int m) //n為邊總數,m為頂點總數
}if(road_num
return -1;
else
return min_cost;
}
克魯斯卡爾(Kruskal)演算法求最小生成樹
基本思想 設無向連通網為g v,e 令g的最小生成樹為t u,te 其初態為u v,te 然後,按照邊的權值由小到大的順序,考察g的邊集e中的各條邊。若被考察的邊的兩個頂點屬於t的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到t中,同時把兩個連通分量連線為乙個連通分量 若被考察邊的兩個頂點屬於...
克魯斯卡爾(Kruskal)演算法求最小生成樹
1 基本思想 設無向連通網為g v,e 令g的最小生成樹為t u,te 其初態為u v,te 然後,按照邊的權值由小到大的順序,考察g的邊集e中的各條邊。若被考察的邊的兩個頂點屬於t的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到t中,同時把兩個連通分量連線為乙個連通分量 若被考察邊的兩個頂點...
克魯斯卡爾(Kruskal)演算法求最小生成樹
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!1 基本思想 設無向連通網為g v,e 令g的最小生成樹為t u,te 其初態為u v,te 然後,按照邊的權值由小到大的順序,考察g的邊集e中的各條邊。若被考察的邊的兩個頂點屬於t的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到t中,同時把...