D08 最小生成树 Kruskal 算法

D08 最小生成树 Kruskal 算法_哔哩哔哩_bilibili

P3366 【模板】最小生成树 - 洛谷

1. 边集 {u,v,w} 排序

2. 并查集维护最优选边

// Kruskal算法 O(mlogm)
#include<bits/stdc++.h>
using namespace std;

const int N=200010;
int n,m;
struct edge{
  int u,v,w;
  bool operator<(const edge &t)const
  {return w<t.w;}   
}e[N];
int fa[N],ans,cnt;

int find(int x){
  if(fa[x]==x) return x;
  return fa[x]=find(fa[x]);
}
bool kruskal(){
  sort(e,e+m);
  for(int i=1;i<=n;i++) fa[i]=i;
  for(int i=0; i<m; i++){
    int x=find(e[i].u);
    int y=find(e[i].v);
    if(x!=y){
      fa[x]=y;
      ans+=e[i].w;
      cnt++;
    }
  }
  return cnt==n-1;
}
int main(){
  cin>>n>>m;
  for(int i=0; i<m; i++)
    cin>>e[i].u>>e[i].v>>e[i].w;
  if(!kruskal()) puts("orz");
  else printf("%d\n",ans);
}

 

最小生成树 - OI Wiki

P4180 [BJWC2010] 严格次小生成树 - 洛谷

 

posted @ 2022-05-28 13:19  董晓  阅读(1707)  评论(0)    收藏  举报