將邊的權值從小到大排序,依次取邊,需要該邊上的點是否已經連通(查並集)。
適用稀疏圖,邊少點多。
#include
#include
using
namespace std;
const
int maxn=
1e4+4;
const
int maxm=
1e6+6;
int n,m;
int f[maxn]
;int
find
(int x)
struct node
;bool
cmp(node a,node b)
node a[maxm]
;int
main()
sort
(a+1
,a+1
+m,cmp)
;int k=
0,ans=0;
for(
int i=
1;i<=m;i++
)//kk==n-
1? cout<"orz"
;return0;
}
從任意點開始,遍歷此點的所有邊,選此時生成樹權值最小的一條進行連線。
適用稠密圖,邊多點少。
/*
prim演算法
從任意點開始,遍歷此點的所有邊,選權值最小的一條進行連線
*/#include
using
namespace std;
const
int maxm=
1e6+5;
const
int maxn=
1e3+5;
const
int inf=
1e9;
struct edge
;edge e[maxm<<1]
;int head[maxn]
,dis[maxn]
,cnt=
1,n,m,vis[maxn]
;inline
void
add(
int u,
int v,
int w)
intmain()
for(
int i=
2;i<=n;i++
)//從1開始
dis[i]
=inf;
for(
int i=head[1]
;i;i=e[i]
.next)
//從1開始
int count=0;
long
long ans=0;
int now=1;
while
(++count} ans+
=min1;
//列舉now的所有連邊,更新dis陣列
for(
int j=head[now]
;j;j=e[j]
.next)
} cout
}
最小生成樹模板
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 輸出格式 輸出...