最小生成樹(模板)

2021-10-06 15:31:53 字數 1621 閱讀 6653

最小生成樹(mst):將給出的所有點連線起來(即從乙個點可到任意乙個點),且連線路徑之和最小的圖叫最小生成樹。

資料結構:樹形結構,或者說是直鏈型結構,因為當n個點相連,且路徑和最短,那麼將它們相連的路一定是n-1條

實現思路:將點分為在樹中的點與不在樹中的點,每次取出樹中點的連線的最小路徑,且該路徑連線的點不在樹中,然後將該路徑連線的點加入樹中,重複並進行路徑更新,即鬆弛,當取出邊達到n-1條時,樹已建立。

洛谷p1546

求一條路徑,使得u到v連通的路徑的最小長度

(prim演算法)

本質上還是貪心思想。

#include

#include

#include

using

namespace std;

const

int maxn=

110;

const

int inf=

0x3f3f3f3f

;int n;

int adj[maxn]

[maxn]

;int cost[maxn]

,vis[maxn]

;int

prim()

cost[1]

=0;//將1號點加入集合

int res=0;

//儲存答案

for(

int i=

1;i<=n;i++)}

vis[minn]=1

;//將點加入集合

res+

=cost[minn]

;//代價及時加上去

for(

int i=

1;i<=n;i++)}

}return res;

}int

main()

洛谷p3366

kruskal演算法:還是貪心思想。(sort+並查集)

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

5005

;const

int maxm=

200205

;int father[maxn]

;int n,m;

int mst;

struct node

}g[maxm]

;int

find

(int x)

void

merge

(int v,

int u)

boolk(

)int cnt;

cnt=mst=0;

sort

(g,g+m)

;for

(int i=

0;ireturn

false;}

intmain()

if(k(

))else cout<<

"orz"

}

最小生成樹模板

prim演算法理解可以參考部落格 prim演算法模板 int prime int v int i,j,sum 0,min,k sum是權重和 for i 1 i n i lowcost i 表明當前狀態下在u內距離v點 s中各點 距離的最小值,每個u中點s 中點 都計算 lowcost i map ...

最小生成樹 模板

const int maxn 1010 const int maxm 200020 struct edge edges maxm int father maxn int find int x int cmp edge a,edge b 將邊按權值排序 int kruskal int n,int m ...

模板 最小生成樹

題目描述 如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出...