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;
int fa[N],ans,tot;
pair<int,pair<int,int> >e[N]; //边集

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

 

最小生成树 - OI Wiki

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

 

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