最大边最小的路径
Posted poised
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大边最小的路径相关的知识,希望对你有一定的参考价值。
【问题描述】
给定 n 个结点,m 条边的带权无向图,请你求 s 到 t所有路径中,权值最大的边的最小的那条路径,输出这个最大边的最小值。
【输入格式】
第一行两个整数 n 和 m ,图的每个点编号为 1∼n。
接下来的 m 行,每行 3 个整数:u v w,表示边无向边 (u,v) 的权值为 w。
最后一行是 ss 和 tt。
【输出格式】
输出 s 到 t 路径上的最大边的最小值。
【输入输出样例】
Input
Output
【数据说明】
对于 100% 的数据 1≤n≤50000,1≤m≤100000,边权不超过 10^9。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m; 4 const int maxn=0x3f3f3f; 5 struct name{ 6 int u,v,w; 7 }e[maxn]; 8 bool bml(name x,name y) 9 { 10 return x.w<y.w; 11 } 12 int pa[maxn]; 13 void makeset() 14 { 15 for(int i=1;i<=n;i++) 16 { 17 pa[i]=i; 18 } 19 } 20 int Find(int x) 21 { 22 int r=x; 23 while(pa[r]!=r) 24 r=pa[r]; 25 26 while(x!=r) 27 { 28 int y=pa[x]; 29 pa[x]=r; 30 x=y; 31 } 32 return r; 33 } 34 void Link(int x,int y) 35 { 36 int a=Find(x),b=Find(y); 37 if(a!=b) 38 { 39 pa[a]=b; 40 } 41 } 42 bool Query(int x,int y) 43 { 44 return Find(x)==Find(y); 45 } 46 int main() 47 { 48 scanf("%d%d",&n,&m); 49 for(int i=1;i<=m;i++) 50 { 51 scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); 52 } 53 sort(e+1,e+1+m,bml); 54 int s,t; 55 cin>>s>>t; 56 57 makeset(); 58 for(int i=1;i<=m;i++) 59 { 60 Link(e[i].u,e[i].v); 61 if(Query(s,t)==1) 62 { 63 cout<<e[i].w<<endl; 64 return 0; 65 } 66 } 67 return 0; 68 }
以上是关于最大边最小的路径的主要内容,如果未能解决你的问题,请参考以下文章
求最大边/最小边的比值最小的路径 codevs 1001 舒适的路线