最小生成樹

2022-06-09 04:39:10 字數 2866 閱讀 8724

給定乙個無向圖,每條邊有乙個非負權值。求這個圖中最小生成樹的所有邊的權值之和。生成樹是指包含圖中所有節點的一棵樹,而最小生成樹則指一棵所有邊的權值之和最小的生成樹。

輸入

第一行包含兩個數,n和m,其中n為節點數,m為邊數。下面m行,每行三個非負整數a、b和c,a, b輸出

輸出乙個數,表示一棵最小生成樹所有邊的權值之和。

樣例輸入

copy

5 8

0 1 1

0 2 2

0 3 5

0 4 7

1 2 0

2 3 15

2 4 25

1 4 100

樣例輸出 copy

13

提示

對於30%的資料,m≤10;

對於50%的資料,m≤1000;

對於100%的資料,m≤100000,c≤2000。

演算法:kruskal(克魯斯卡爾)演算法開始時,認為每乙個點都是孤立的,分屬於n個獨立的集合。

5個集合,,,, }

生成樹中沒有邊

kruskal每次都選擇一條最小的邊,而且這條邊的兩個頂點分屬於兩個不同的集合。將選取的這條邊加入最小生成樹,並且合併集合。

第一次選擇的是<1,2>這條邊,將這條邊加入到生成樹中,並且將它的兩個頂點1、2合併成乙個集合。

4個集合,,, }

生成樹中有一條邊

第二次選擇的是<4,5>這條邊,將這條邊加入到生成樹中,並且將它的兩個頂點4、5合併成乙個集合。

3個集合,, }

生成樹中有2條邊

第三次選擇的是<3,5>這條邊,將這條邊加入到生成樹中,並且將它的兩個頂點3、5所在的兩個集合合併成乙個集合  

2個集合, }

生成樹中有3條邊

第四次選擇的是<2,5>這條邊,將這條邊加入到生成樹中,並且將它的兩個頂點2、5所在的兩個集合合併成乙個集合。  

1個集合 }

生成樹中有4條邊

演算法結束,最小生成樹權值為19。

通過上面的模擬能夠看到,kruskal演算法每次都選擇一條最小的,且能合併兩個不同集合的邊,一張n個點的圖總共選取n-1次邊。因為每次我們選的都是最小的邊,所以最後的生成樹一定是最小生成樹。每次我們選的邊都能夠合併兩個集合,最後n個點一定會合併成乙個集合。通過這樣的貪心策略,kruskal演算法就能得到一棵有n-1條邊,連線著n個點的最小生成樹。

kruskal演算法的時間複雜度為o(e*loge),e為邊數。

int find(int

x) 並差集 壓縮路徑

fora(i,

1,n) fa[i]=i; 初始化,將父親指向自己

sort(edge+1,edge+1+n,cmp);排序

fora(i,

1,m)

returnx;}

const

int maxn=1e6+100

;int

pre[maxn],n,m;

struct

nodea[maxn];

bool

cmp(node x,node y)

void

inint()

}int find(int h)//

找根?

intmerge(node n)

return0;

} int

main()

sort(a+1,a+m+1

,cmp);

ll num=0,ans=0

;

for(int i=1;i<=m&&num<=n-1;i++)

}printf(

"%lld\n

",ans);

}

克魯斯卡爾並查集加排序預處理,現將所有的節點的父親指向自己

輸入m條邊,切記,只需要m條邊

按每一條邊的權值排序

最後並查集來查詢,看是否加入到生成樹中,注意並查集模板是這樣寫的

int find(intx)edge[

400005

];int

num_edge;

void add_edge(int

from,int to,int

dis)

; head[

from]=num_edge;

}typedef pair

pp;priority_queue

,greater> q;//

first dis second u

void

prim()

}int

main()

prim();

if (cnt==n)printf("%d"

,ans);

else printf("

orz"

);}

最小生成樹 次小生成樹

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