【问题描述】
给定 n 个结点,m 条边的带权无向图,请你求 s 到 t所有路径中,权值最大的边的最小的那条路径,输出这个最大边的最小值。
【输入格式】
第一行两个整数 n 和 m ,图的每个点编号为 1∼n。
接下来的 m 行,每行 3 个整数:u v w,表示边无向边 (u,v) 的权值为 w。
最后一行是 ss 和 tt。
【输出格式】
输出 s 到 t 路径上的最大边的最小值。
【输入输出样例】
Input
7 10
1 2 30
1 3 15
1 4 10
2 4 25
2 5 60
3 4 40
3 6 20
4 7 35
5 7 20
6 7 30
1 7
Output
30
【数据说明】
对于 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 }
标签:10,路径,最大,int,30,最小,权值,name 来源: https://www.cnblogs.com/poised/p/12110710.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。