大概思路
这题就是基本的克鲁斯卡尔(Kruskal)算法求最小生成树,很不错的一道标准模板题。
但是呢,唯一需要注意的是每加入一条边都要判断s,t是不是在一个集合里面的。
好了会话多说少说,直接上代码:
代码
#include <bits/stdc++.h>
using namespace std;
int n,m,s,t,c[10001],ans=0;
struct mate{
int u,v,w;
}a[1919801];
int cmp(mate b,mate c){
return b.w<c.w;
}
int find(int g){
if(c[g]!=g){
c[g]=find(c[g]);
}
return c[g];
}
int tion(int x1,int x2){
int y1=find(x1);
int y2=find(x2);
if(y1!=y2){
c[y1]=y2;
}
}
int cover(){
int j=1,k=1;
for(int i=1;i<=n;i++){
while(find(a[i].u)==find(a[i].v)){
j++;
}
ans=max(a[i].w,ans);
tion(a[i].u,a[i].v);
k++;
if(find(s)==find(t)){
break;
}
}
}
int main(){
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
cin>>a[i].u>>a[i].v>>a[i].w;
}
for(int i=1;i<=n;i++){
c[i]=i;
}
sort(a+1,a+1+m,cmp);
cover();
cout<<ans;
return 0;
}
不要脸的要个赞
~ qwq ~