最小生成樹(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 輸出格式 輸出...