c++最小生成树两种方法: Prim算法 和 Kruskal算法
- Prim算法: 算法思想:
假设G=(V,E)是连通的,TE是G上最小生成树中边的集合。算法从U={u0}(u0∈V)、TE={}开始。重复执行下列操作:
在所有u∈U,v∈V-U的边(u,v)∈E中找一条权值最小的边(u0,v0)并入集合TE中,同时v0并入U,直到V=U为止。
此时,TE中必有n-1条边,T=(V,TE)为G的最小生成树。 Prim算法的核心:始终保持TE中的边集构成一棵生成树。
算法过程:
随意选取一点 , 寻找最小权值
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f,maxn=100,maxm=maxn*maxn;
struct edge{
int from,to,w,nxt;
}e[maxm];
int n,m,head[maxn],cnt,dis[maxn],u,v,w,ans;
bool vis[maxn];
void add(int u,int v,int w){
e[++cnt].from=u;
e[cnt].to=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]