一、kruskal(yyds)
kruskal简单易懂,用并查集维护联通图就行
直接扔代码
int getf(int x){
return x == fa[x] ? x : fa[x] = getf(fa[x]);
}
struct edge{
int u,v,w;
bool operator < (const edge& b)const {
return w < b.w;
}
}e[M];//边的集合
int kruskal(){
int ans = 0;
for(int i = 1;i <= n;i ++) fa[i] = i;
sort(e, e + cnt);//把边按权重升序排
for(int i = 0;i < cnt;i ++){
int fu = getf(e[i].u);
int fv = getf(e[i].v);
if(fu != fv){
fa[fu] = fv;
ans += e[i].w;
}
}
return ans;
}
二、prim朴素写法
能用kruskal绝不用prim!
大佬说堆优化可能会wa,所以只给出朴素写法的代码
int prim(){
int ans = 0;
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
for(int i = 0;i < n;i ++){
int t = 0;
for(int j = 1;j <= n;j ++){
if(!vis[j] && (t == 0 || d[j] < d[t])){
t = j;
}
}
if(i && d[t] == INF) return INF;
if(i) ans += d[t];
vis[t] = 1;
for(int j = 1;j <= n;j ++){
if(!vis[j]) d[j] = min(d[j],g[t][j]);
}
}
return ans;
}```