6313: 营救 最小生成树+单边最大值
描述
“咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动得热泪盈眶,开启了门……
妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了 t 区,而自己在 s 区。
该市有 m 条大道连接 n 个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从 s 至 t 的路线,使得经过道路的拥挤度最大值最小。
输入
第一行有四个用空格隔开的 n,m,s,t,其含义见上方。
接下来 m 行,每行输入三个整数 u, v, w 分别表示有一条连接区 u 和区 v 的大道,其拥挤度为 w。(两个区之间可能存在多条大道)
数据保证从s区出发一定能到达t区,且1≤n≤10000, 1≤m≤20000, w≤10000, 1≤s, t≤n。
输出
输出仅一个整数,代表规划路线中最大的拥挤度。
样例输入
3 3 1 3
1 2 2
2 3 1
1 3 3
样例输出
2
提示
经过道路的拥挤度最大值指路线中某条最拥挤的大道的拥挤度,并非总拥挤度!
思路:
最小生成树构成图的过程中通过找起点终点的父节点和当前这一条边的父节点,看看是不是互通的,如果是那么就更新最大权值
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 10005; 4 int f[N],vis[N]; 5 int n,m,s,t,ans; 6 struct node{ 7 int x,y,z; 8 }; 9 node a[N+N]; 10 bool cmp(node a,node b) 11 { 12 return a.z<b.z; 13 } 14 int find(int x) 15 { 16 if(f[x]!=x)f[x] = find(f[x]); 17 return f[x]; 18 } 19 void merger(int x,int y) 20 { 21 int dx = find(x); 22 int dy = find(y); 23 f[dy] = dx; 24 } 25 26 int main() 27 { 28 cin>>n>>m>>s>>t; 29 for(int i=1;i<=n;i++)f[i] = i; 30 for(int i=1;i<=m;i++) 31 { 32 cin>>a[i].x>>a[i].y>>a[i].z; 33 } 34 sort(a+1,a+1+m,cmp); 35 int sum = 0,maxx = 0; 36 for(int i=1;i<=m;i++) 37 { 38 int f1 = find(a[i].x),f2 = find(a[i].y); 39 if(f1==f2)continue; 40 int k1 = find(s),k2 = find(t); 41 if((k1==f1&&k2==f2)||(k1==f2&&k2==f1)) //如果能实现起点和终点互通 42 { 43 maxx = max(maxx,a[i].z); //更新最大拥挤度 44 } 45 f[f1] = f2; 46 sum++; 47 if(sum==n-1)break; 48 } 49 cout<<maxx; 50 return 0; 51 }