计蒜客 营救

营救

题目描述

“咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门……

妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值