最小生成樹,回憶複習篇。
以前聽過一遍最小生成樹,可惜,當時沒弄會。過了幾天就全忘了。而如今在做lca的時候,woc我居然不會最小生成樹了。
所以來回憶一下最小生成樹。
kruskal演算法。這個演算法的主要工具就是,排序,並查集。這裡的排序是一種貪心做法。把邊權最小的邊排在前面,之後開始乙個乙個取。每次都取小的邊,取到n-1條邊(剛好遍歷每個點)但是每次取的時候都要保證這條邊加在這棵最小生成樹裡面不會產生環,所以,這裡用並查集就是記錄每次加邊時的點,不讓加的這條邊的兩節點連在一起之後產生環。如果這條邊連上沒產生環,那麼它們的父親就相連.這樣讓這個並查集組成的樹的節點相連,而不是子節點相連,這個地方可以去翻閱並查集的資料。這裡不在多說什麼。
其實就是這麼簡單,並不是很難。這棵樹遍歷了所有的點,而且保證最短。而這就是乙個工具模型。嗯就是這樣。
我覺得這個沒必要模擬。所以這個記住
1,瘋狂調sort
2,瞎基本用並查集連邊。
嗯,記住如果要使用得從新建樹。
好了。來一道模版壓壓驚。
codevs1078 最小生成樹
題目描述 description
農民約翰被選為他們鎮的鎮長!他其中乙個競選承諾就是在鎮上建立起網際網路,並連線到所有的農場。當然,他需要你的幫助。 約翰已經給他的農場安排了一條高速的網路線路,他想把這條線路共享給其他農場。為了使花費最少,他想鋪設最短的光纖去連線所有的農場。 你將得到乙份各農場之間連線費用的列表,你必須找出能連線所有農場並所用光纖最短的方案。 每兩個農場間的距離不會超過100000
輸入描述 input description
第一行: 農場的個數,n(3<=n<=100)。
第二行..結尾: 接下來的行包含了乙個n*n的矩陣,表示每個農場之間的距離。理論上,他們是n行,每行由n個用空格分隔的數組成,實際上,他們每行限制在80個字元以內,因此,某些行會緊接著另一些行。當然,對角線將會是0,因為線路從第i個農場到它本身的距離在本題中沒有意義。
輸出描述 output description
只有乙個輸出,是連線到每個農場的光纖的最小長度和。
樣例輸入 sample input
40 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
樣例輸出 sample output
28這道題,就是找乙個最小生成樹之後把邊都加起來
#include#include#includeusing namespace std;struct nodeedge[10001];
struct node_1map_1[10001];
int father[100001],head[100001];
int find_1(int x)
int cmp(node_1 a,node_1 b)
int main()
sort(map_1+1,map_1+1+cnt,cmp);
int ans=0,cnt_1=0;
for(int i=1;i<=cnt;i++)//這裡的cnt很有趣。因為前面的n-1條邊可能不會是最小生成樹。所以都要遍歷一邊。
if(cnt_1==n-1)break;//注意取邊的邊數。
}printf("%d\n",ans);
return 0;
}
最小生成樹演算法複習
目錄 最小生成樹演算法複習 1.prim演算法 演算法描述 2.kruskal 演算法 演算法描述 求最小生成樹是資料結構中圖的一種重要應用,乙個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊。而求最小生成樹有兩種演算法,一種是prim...
演算法總結篇 最小生成樹
目錄算是最後幾個完成這一章節學習的了,有很多思想和技巧都很好,需要好好學習 主要涉及兩個演算法 prim 演算法和 kruskal 演算法 感謝lsp為本文訂正做出的貢獻!先跑一遍 dij 求出 d i 再遍歷每個點,統計有幾種修建方案 然後根據乘法原理,求出所有方案數即可 感覺和最小生成樹沒半毛錢...
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...