首先,什麼是kruskal演算法:
克魯斯卡爾演算法(kruskal's algorithm)是兩個經典的最小生成樹演算法的較為簡單理解的乙個。這裡面充分體現了貪心演算法的精髓。大致的流程可以用乙個圖來表示。這裡的圖的選擇借用了wikipedia上的那個。非常清晰且直觀。
首先第一步,我們有一張圖,有若干點和邊
第一步我們要做的事情就是將所有的邊的長度排序,用排序的結果作為我們選擇邊的依據。這裡再次體現了貪心演算法的思想。資源排序,對區域性最優的資源進行選擇。
排序完成後,我們率先選擇了邊ad。這樣我們的圖就變成了
第二步,在剩下的邊中尋找。我們找到了ce。這裡邊的權重也是5
依次類推我們找到了6,7,7。完成之後,圖變成了這個樣子。
下一步就是關鍵了。下面選擇那條邊呢? bc或者ef嗎?都不是,儘管現在長度為8的邊是最小的未選擇的邊。但是他們已經連通了(對於bc可以通過ce,eb來連線,類似的ef可以通過eb,ba,ad,df來接連)。所以我們不需要選擇他們。類似的bd也已經連通了(這裡上圖的連通線用紅色表示了)。
最後就剩下eg和fg了。當然我們選擇了eg。最後成功的圖就是下圖:
到這裡所有的邊點都已經連通了,乙個最小生成樹構建完成。
kruskal演算法的時間複雜度由排序演算法決定,若採用快排則時間複雜度為o(n log n)。
其實就是不斷取最小邊,判斷是否可行,從某種程度上來說是「貪心」
判斷是否可行便要使用並查集(這裡就不說了);
做了不少題目,總結kruskal演算法的幾種題型:
1.最基礎的,簡單的,直接套就行;
2.有新增條件,可以減少連線邊的題型,只需讀懂題目便行(如無線通訊網);
3.需要自己計算(獲取)邊的長度的題,像矩陣,座標系一類的;
4.不是取最短路徑,而是第二短,第n短一類的(important):
time limit: 1000 ms
memory limit: 128 mb
description
約翰叔叔希望能夠廉價連線他的供水系統,但是他不希望他的競爭對手知道他選擇的路線。一般這樣的問題需要選擇最便宜的方式,所以他決定避免這種情況而採用第二便宜的方式。
現在有w(3 <= w <= 2000)個供水站,其中最多有p(p <= 20,000)條管道,每一條管道連線了兩個水站,並且不存在一條管道連線同乙個水站,兩個水站之間最多只有一條管道。每條管道有一定的費用。請尋找第二便宜的連線方式,使所有的水站相連。
假設最便宜的方案有且只有一種,並且至少有兩種可行的連線方案。所有的費用都不超過16位有符號整數。水站用1到w的自然數表示。
input
第一行:兩個數w和p
第2~p+1行:每行描述了一條管道,有3個用空格分開的整數,前兩個數表示管道連線的兩個端點。第3個數是管道的費用。
output
僅一行,第二便宜的管道鋪設費用。
sample input
5 71 2 3
2 3 4
1 4 7
2 4 11
2 5 9
5 4 5
3 5 8
sample output
20這題需要得出最短路徑,然後再刪除該路徑任意一條邊,再求一次,迴圈n-1次,得出第二短路徑
#include#include#include#includeusing namespace std;
struct pipep[20005];
int f[2005];
int m,n;
bool pdd[20005];
bool comp(const pipe a,const pipe b)
if(ans==0) break;
}int maxn=wal;//找最短;
int sum=20005*2000;
bool pd[n+1];
for(int j=1;j<=n;j++)//一條一條邊試著刪;
if(pdd[j])
if(ans==0) break;
}if(wal=maxn*/) sum=wal;
}cout以上便是全部總結。
只要善於思考,一切題型一定可以迎刃而解的!!!!!!!!!
最小生成樹演算法
由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...
最小生成樹演算法
乙個最簡單的最小生成樹 圖結構練習 最小生成樹 time limit 1000ms memory limit 65536k 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。輸...
演算法 最小生成樹
前言 最小生成樹是在乙個給定的無向圖中求一棵樹,這棵樹包含無向圖中的所有頂點,且樹中的邊都來自無向圖中的邊,並且要滿足整棵樹的邊權之和最小。1 最小生成樹是樹,其邊數等於頂點數減1,且不會有環 2 對於給定的圖最小生成樹可以不唯一,但是邊權之和一定是唯一的。3 其根節點可以是這棵樹上的任何乙個節點,...