P1396 营救

题目背景

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

题目描述

妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了 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

题目分析

寻找通过st经过道路的拥挤度最大值最小先将所有的道路进行排序(升序);
最后一个使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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值