首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【HDU】1598 - find the most comfortable road(并查集 & 暴力)

【HDU】1598 - find the most comfortable road(并查集 & 暴力)

作者头像
FishWang
发布2025-08-27 09:52:58
发布2025-08-27 09:52:58
7900
代码可运行
举报
运行总次数:0
代码可运行

点击打开题目

find the most comfortable road

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6479 Accepted Submission(s): 2763

Problem Description

XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ), 但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。

Input

输入包括多个测试实例,每个实例包括: 第一行有2个正整数n (1<n<=200)和m (m<=1000),表示有N个城市和M条SARS。 接下来的行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speedSARS。speed<=1000000 然后是一个正整数Q(Q<11),表示寻路的个数。 接下来Q行每行有2个正整数Start,End, 表示寻路的起终点。

Output

每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。如果起点和终点不能到达,那么输出-1。

Sample Input

代码语言:javascript
代码运行次数:0
运行
复制
   4 4
1 2 2
2 3 4
1 4 1
3 4 2
2
1 3
1 2

Sample Output

代码语言:javascript
代码运行次数:0
运行
复制
   1
0

Author

ailyanlu

Source

HDU 2007-Spring Programming Contest - Warm Up (1)

最近做的题暴力的可怕,居然还就是这么暴力的枚举AC了。

思路:把边的权值排序(其实从小到大和从大到小都可以),然后从edge[ 0 ]开始,往后依次用克鲁斯塔尔的方法用并查集连边,若如联通更新一下ans值(边是排好顺序的,直接用edge[i].cost - edge[j].cost就行了)

代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MAX 200
struct node
{
	int u,v,cost;
}edge[1011];
bool cmp(node a ,node b)
{
	return a.cost > b.cost;
}
int f[MAX+11];
int find(int x)
{
	if (x != f[x])
		f[x] = find (f[x]);
	return f[x];
}
void join(int x,int y)
{
	int fx = find (x);
	int fy = find (y);
	if (fx != fy)
		f[fx] = fy;
}
int main()
{
	int n,m;
	while (~scanf ("%d %d",&n,&m))
	{
		for (int i = 0 ; i < m ; i++)
			scanf ("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].cost);
		sort(edge,edge+m,cmp);
		int q;
		scanf ("%d",&q);
		while (q--)
		{
			int st,endd;
			int ans = INF;
			scanf ("%d %d",&st,&endd);
			for (int i = 0 ; i < m ; i++)
			{
				for (int j = 1 ; j <= n ; j++)
					f[j] = j;
				for (int j = i ; j < m ; j++)
				{
					join(edge[j].u , edge[j].v);
					if (find(st) == find(endd))		//已经连通
					{
						ans = min(ans , edge[i].cost - edge[j].cost);
						break;
					}
				}
			}
			if (ans == INF)
				printf ("-1\n");
			else
				printf ("%d\n",ans);
		}
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • find the most comfortable road
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档