kruskal也不怕自环和重边

kruskal也不怕自环和重边
因其有并查集和排序的操作
排序保证了每次选最优边
并查集保证每次两点不在同一集合,所以保证了无重边和自环

此题分析:两点在同一集合表示已联通

#include<bits/stdc++.h>
using namespace std;
int const M=2e4+7;
int const N=1e4+7;
struct node{
  int a,next,len;
  friend bool operator<(node a,node b){
    return a.len < b.len ;
  }
}e[M];
int f[N];
int find(int x){
  return f[x]==x?x:f[x]=find(f[x]);
}
void merge(int x,int y){
  f[find(x)]=find(y);
}
int n,m,s,t;
int kruskal(int mid){
  sort(e+1,e+n+1);
  for(int i=1;i<=n;++i) f[i]=i;
  for(int i=1;i<=m;++i){
    int a=e[i].a , b=e[i].next ;
    if(e[i].len <=mid &&find(a)!=find(b)){
      merge(a,b);
      if(find(s)==find(t)) return 1;
    }
  }
  return 0;
}
int main(){
  cin >> n >> m >> s >> t;
  for(int i=1;i<=m;++i){
    cin >> e[i].a >> e[i].next >> e[i].len ;
  }
  int l=0,r=2e4;
  while(l<=r){
    int mid=(l+r)>>1;
    if(kruskal(mid)) r=mid-1;
    else l=mid+1;
  }
  cout << l << endl;
  return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 11:35
程序员小白条:话太多,没实力和学历,差不多回答回答就行了,身份地位不一样
点赞 评论 收藏
分享
下北澤大天使:你是我见过最美的牛客女孩😍
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务