最小生成樹

2022-05-17 06:08:54 字數 2065 閱讀 9457

**克魯斯卡爾(kruskal)演算法(只與邊相關)

演算法描述:克魯斯卡爾演算法需要對圖的邊進行訪問,所以克魯斯卡爾演算法的時間複雜度只和邊又關係,可以證明其時間複雜度為o(eloge)。

演算法過程:

1.將圖各邊按照權值進行排序

2.將圖遍歷一次,找出權值最小的邊,(條件:此次找出的邊不能和已加入最小生成樹集合的邊構成環),若符合條件,則加入最小生成樹的集合中。不符合條件則繼續遍歷圖,尋找下乙個最小權值的邊。

3.遞迴重複步驟1,直到找出n-1條邊為止(設圖有n個結點,則最小生成樹的邊數應為n-1條),演算法結束。得到的就是此圖的最小生成樹。

克魯斯卡爾(kruskal)演算法因為只與邊相關,則適合求稀疏圖的最小生成樹。而prime演算法因為只與頂點有關,所以適合求稠密圖的最小生成樹。

並查集 +快排

**:view code

1 #include2 #include

3 #include 4 typedef struct

node

5st;

8 st q[10001];9

using

namespace

std;

10bool cmp(const st &a,const st &b)

1114

int num,father[201

],sum;

15int find(int

a)16

21void union1(int a, int b,int

c)2231}

32int

main()

3348

return0;

49 }

普利姆(prime)演算法(只與頂點相關)

演算法描述:

普利姆演算法求最小生成樹時候,和邊數無關,只和定點的數量相關,所以適合求稠密網的最小生成樹,時間複雜度為o(n*n)。

演算法過程:

1.將乙個圖的頂點分為兩部分,一部分是最小生成樹中的結點(a集合),另一部分是未處理的結點(b集合)。

2.首先選擇乙個結點,將這個結點加入a中,然後,對集合a中的頂點遍歷,找出a中頂點關聯的邊權值最小的那個(設為v),將此頂點從b中刪除,加入集合a中。

3.遞迴重複步驟2,直到b集合中的結點為空,結束此過程。

4.a集合中的結點就是由prime演算法得到的最小生成樹的結點,依照步驟2的結點連線這些頂點,得到的就是這個圖的最小生成樹。

演算法實現具體過程:

1.將第乙個點放入最小生成樹的集合中(標記visit[i]=1意思就是最小生成樹集合)。

2.從第二個點開始,初始化lowcost[i]為跟1點相連(僅僅相連)的邊的權值(lowcost[i]不是這個點的最小權值!在以後會逐步更新)。

3.找最小權值的邊。

從第二點開始遍歷,如果不是最小生成樹的集合的點,則找出從2到n的最小權值(lowcost[j])。

4.將找出來的最小權值的邊的頂點加入最小生成樹的集合中(標記visit[i] = 1),權值相加。

5.更新lowcost[j]集合。

假設第一次:lowcost[2]代表與1相連的點的權值,現在加入了k點。則比較k點與2點的邊map[k][2]和lowcost[2]的大小,若lowcost[2]大,則lowcost[2] = map[k][2]。(關鍵步驟:實質就是每在最小生成樹集合中加入乙個點就需要把這個點與集合外的點比較,不斷的尋找兩個集合之間最小的邊)

6.迴圈上述步驟,直到將全部頂點加入到最小生成樹集合為止。

**:view code

1 #include2 #include

3#define inf 0x3f3f3f3f

4int w[101][101];5

int visit[101],low[101

],sum;

6void prime(intn)7

27}28int

main()

2943}44

prime(n);

45 printf("

%d\n

",sum);46}

47return0;

48 }

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 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...