营救
题目描述
“咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门……
妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了 t 区,而自己在 s 区。
该市有 m 条大道连接 n 个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从 s 至 t 的路线,使得经过道路的拥挤度最大值最小。
输入格式
第一行四个数字 n,m,s,t。
接下来 m 行,每行三个数字 u,v,w,分别表示两个区和拥挤度。(有可能两个区之间有多条大道相连。)
数据范围:2<= n <=10^4,n≤m≤2n,1<=u,v,s,t<=n ,1≤w≤10^4 。
输出格式
输出题目要求的拥挤度。
样例输入
3 3 1 3
1 2 2
2 3 1
1 3 3
样例输出
2
思路
最小生成树
从最短路开始走 使得S区和T区的祖宗相同时停止 此时拥挤度为最小
#include<stdio.h>
#include<algorithm>
using namespace std;
int f[101010];
//输入后用结构体排序 使距离小的在前面
struct paix
{
int a,b,l;
} px[101010];
bool my(paix x,paix y)
{
return x.l<y.l;
}
int cha(int u)
{
if(f[u]!=u) f[u]=cha(f[u]);
return f[u];
}
void huan(int u,int v)
{
int t1,t2;
t1=cha(u);
t2=cha(v);
if(t1>t2) f[t1]=t2;
if(t2>t1) f[t2]=t1;
}
int main()
{
int n,m,s,t,v,i,maxx;
scanf("%d %d %d %d",&n,&m,&s,&t);
//初始化每个街区的祖宗为他自己
for(i=1; i<=n; i++)
f[i]=i;
for(i=0; i<m; i++)
scanf("%d %d %d",&px[i].a,&px[i].b,&px[i].l);
sort(px,px+m,my);
maxx=px[0].l;
for(i=0; i<m; i++)
{
if(cha(f[s])==cha(f[t])) break;
if(cha(px[i].a)!=cha(px[i].b))
{
huan(px[i].a,px[i].b);//将两个街区的祖宗变为小的那个
maxx=max(maxx,px[i].l);
}
}
printf("%d",maxx);
return 0;
}