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;
}
全部评论

相关推荐

生命诚可贵:先不说内容怎么样 排版就已经太差劲了 第一眼看不到重点,第二眼已经没有再看的耐心了, 篇幅占的太满了 字体不要用灰色 观感不好 想重点突出的黑色加粗就可以了 多列要点 少些大段的句子 项目经历把项目用的技术要点列出来,光写个python plc什么的太宽泛了 自我评价也有点偏多
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务