题目背景
“咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动得热泪盈眶,开起了门……
题目描述
妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了 t 区,而自己在s 区。
该市有 m 条大道连接 n 个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从 s 至t 的路线,使得经过道路的拥挤度最大值最小。
输入格式
第一行有四个用空格隔开的 n,m,s,t,其含义见【题目描述】。
接下来 m 行,每行三个整数 u,v,w,表示有一条大道连接区 u 和区 v,且拥挤度为 w。
两个区之间可能存在多条大道。
输出格式
输出一行一个整数,代表最大的拥挤度。
输入输出样例
输入
3 3 1 3 1 2 2 2 3 1 1 3 3
输出
1
题目分析
寻找通过s到t经过道路的拥挤度最大值最小先将所有的道路进行排序(升序);
最后一个使s区到t区的道路的是通过整个线路(所有点的链接)最短路径(先连接上的s区到t区就是最短路径)的最大值(一条路径中最长的一个);
代码(学来的)
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define re register
#define il inline
struct node{
int u;
int v;
int w;
}e[205000]={0};int f[50000]={0},n,m;
bool cmp( node a, node b)//排序
{
return a.w<b.w;
}
int find(int x)//
{
while(x!=f[x])x=f[x]=f[f[x]];
return x;
}
main()
{
int i,j,k,x,y,z,s,t;
scanf("%d %d %d %d",&n,&m,&s,&t);
for(i=1;i<=m;i++)//输入m个点到点的拥挤度
{
scanf("%d %d %d",&x,&y,&z);
e[i].u=x;e[i].w=z;e[i].v=y;
}
sort(e+1,e+1+m,cmp);
for(i=1;i<=n;i++)//并查集
f[i]=i;
for(i=1;i<=m;i++)
{
x=find(e[i].u);y=find(e[i].v);
if(x!=y)//不相同两点变相同(连接)
{
f[x]=y;
}
if(find(s)==find(t))break;//联通直接退出输出
}
printf("%d\n",e[i].w);
}