最小生成樹 kruskal c 演算法 總結

2021-08-18 18:07:57 字數 2422 閱讀 9904

首先,什麼是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 其根節點可以是這棵樹上的任何乙個節點,...