定义:

最小瓶颈路问题是指在一张无向图中,询问一个点对$(u,v)$,需要找出从$u$到$v$的一条简单路径,使路径上所有边中最大值最小。

根据查询次数不同,最小瓶颈路问题可分为单次查询和多次查询。

单次查询:

例题:Luogu P1396 营救 题目链接

题解一:

根据“最大值最小”,不难想到二分答案。

答案肯定处于所有边中最小值和最大值之间,因此我们二分答案,$check$的时候以二分值为基准进行$BFS/DFS$,不经过权值大于二分值的边,如果能搜到终点,则说明二分值过大;如果不能搜到终点,则说明二分值过小。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e4+10,maxm=4e4+10,inf=0x7fffffff;
 4 int heade[maxn],ev[maxm],ew[maxm],nexte[maxm];
 5 int isvis[maxn];
 6 int n,m,s,t,tot=0,mid;
 7 void add_edge(int u,int v,int w){tot++;ev[tot]=v;ew[tot]=w;nexte[tot]=heade[u];heade[u]=tot;}
 8 bool dfs(int ui)
 9 {
10     int i,vi,wi;bool flag=false;
11     isvis[ui]=1;if(ui==t){return true;}
12     for(i=heade[ui];~i;i=nexte[i])
13     {
14         vi=ev[i];wi=ew[i];
15         if(isvis[vi]||wi>mid){continue;}
16         flag|=dfs(vi);
17     }
18     return flag;
19 }
20 int main()
21 {
22     int i,j,u,v,w,l,r,ans;
23     cin>>n>>m>>s>>t;l=inf;r=-inf;
24     memset(heade,-1,sizeof(heade));
25     for(i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&w);l=min(l,w);r=max(r,w);add_edge(u,v,w);add_edge(v,u,w);}
26     while(l<=r)
27     {
28         mid=(l+r)>>1;memset(isvis,0,sizeof(isvis));
29         if(dfs(s)){ans=mid;r=mid-1;}
30         else{l=mid+1;}
31     }
32     cout<<ans;
33     return 0;
34 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-05
  • 2021-06-23
  • 2021-11-21
  • 2022-03-08
  • 2022-02-27
猜你喜欢
  • 2022-12-23
  • 2021-11-26
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-27
  • 2021-05-27
相关资源
相似解决方案