P1396 营救
链接:Miku
------------------------
一道很贴切的题目
------------------------
这道题可以用各种修改后的图论算法等,不过单单是二分答案也是可以解决的。
检查一下对于每一个最大值,不走所有比此值大的路,看一下能不能走到终点即可
---------------------------
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,s,t; int he[100001]; int p; int vis[100001]; struct b{ int v; int ne; int to; }e[200001]; int x,y,z; void add(int f,int t,int v){ p++; e[p].v=v; e[p].to=t; e[p].ne=he[f]; he[f]=p; } void dfs(int now,int k){ if(vis[now]) return ; vis[now]=1; for(int i=he[now];i;i=e[i].ne){ if(e[i].v<=k) dfs(e[i].to,k); } } bool check(int k){ memset(vis,0,sizeof(vis)); dfs(s,k); if(vis[t]) return 1; else return 0; } int main(){ scanf("%d%d%d%d",&n,&m,&s,&t); for(int i=1;i<=m;++i){ scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } int l=1,r=1000000; while(l<=r){ int mid=l+(r-l)/2; if(check(mid)) r=mid-1; else l=mid+1; } cout<<l; return 0; }