最小生成樹演算法分為
1.prime演算法 o(n^2)
由點到邊,每次將到集合距離最短的集合外的點加入集合中,在鬆弛集合外的點到集合的距離;
2.kruskal 0(mlogm)
將邊從小到大排序,迴圈每一條邊,如果兩點未在同一集合裡(並查集維護),則將該邊加入集合中;
稠密圖用prime,稀疏圖用kruskal
prime
#include#include#include
using
namespace
std;
const
int inf=0x3f3f3f3f
;int
n,m;
int g[510][510
];int dist[510];int vis[510
];int
prime()
return
res;
}int
main()
int t=prime();
if(t==0x3f3f3f3f)printf("
impossible\n");
else
printf(
"%d\n
",t);
return0;
}
kruskal()
#include#includeusing
namespace
std;
intn,m;
int p[200010
];struct
node
}edge[
200010
];int find(int
x)int
main()
sort(edge,edge+m);
for(int i=1;i<=n;i++)
p[i]=i;int res=0,cnt=0;//
cnt存加入集合的邊數
for(int i=0;i//
對每一條邊操作
if(cnt1)printf("
impossible\n");
else
printf(
"%d\n
",res);
return0;
}
最小生成樹Kruskal演算法模板
利用陣列fa來記錄各個節點的父節點,初始化為自己 通過sort排序,從邊長最短到最長 for 邊長 判斷 如果邊的兩個端點的父節點不相同,可選 把選過的邊的兩端點中,大序號的父節點處理為小序號的父節點 include include using namespace std define n 28 i...
最小生成樹 Prim演算法(模板)
基本演算法 首先以乙個結點作為最小生成樹的初始結點,然後以迭代的方式找出與最小生成樹中各結點權重最小邊,並加入到最小生成樹中。選擇一條權值最小,且一端點a已加入生成樹,另一端點b在剩餘結點集內的邊作為最小生成樹上的邊,同時將b列入生成樹的已有點集中。當所有結點都加入到最小生成樹中之後,就找出了連通圖...
模板 最小生成樹 kruskal演算法
題目描述 如題,給出乙個無向圖,求出最小生成樹 輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出包含乙個數,即最小生成樹的各邊...