洛谷P1396 营救
- 题目
- 思路
这道题用的是最小生成树,我用的是Kruskal算法,当然也可以用Prim算法(但是俺不会。。。)
我们可以一边先输入,然后排序,然后跑一下最小生成树,然后如果s区的根和t区的根一样,我们就停止程序
(因为我们事先排序了,所以我们碰到的最后一个一定是最大的最大拥堵值)
- 代码
二话不说,我们先上代码
点击查看代码
#include<bits/stdc++.h>//万能头文件
using namespace std;
int n,m,fa[50100],ok,ans,j,s,t;
int find(int x){//查找
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
struct kk{
int x,y,z;
}a[200010];
bool cmp(kk r,kk l){
return r.z<l.z;
}
int main(){
cin>>n>>m>>s>>t;
for(int i=1;i<=n;i++)
fa[i]=i;//初始化
for(int i=1;i<=m;i++)
cin>>a[i].x>>a[i].y>>a[i].z;
sort(a+1,a+m+1,cmp);//排序
int f=0;
for(int i=1;i<=m;i++){//核心代码
int f1=find(a[i].x);
int f2=find(a[i].y);
if(f1!=f2){
fa[f1]=f2;
ok++;
//ans+=a[i].z;调试
}
if(find(s)==find(t)){//如果联通直接输出退出
cout<<a[i].z;
return 0;
}
}
return 0;
}
- 小妙招
做题一定不要死磕一道题目,不会就看题解,看也不要抄,一定要自己打一遍(这是我的第一篇题解呦!!!)

浙公网安备 33010602011771号