HDU 1598 find the most comfortable road (Kruskal + 枚举)

2024-03-20 14:38

本文主要是介绍HDU 1598 find the most comfortable road (Kruskal + 枚举),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


find the most comfortable road

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 4181    Accepted Submission(s): 1811

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
  
4 4 1 2 2 2 3 4 1 4 1 3 4 2 2 1 3 1 2

Sample Output
  
1 0

Author
ailyanlu

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1598

题目大意:无向图n个点,m条边,每条边有个权值,q个询问,问x到y权值差的最小值,若x y不连通输出-1

题目分析:先对权值排序,从最小权值开始枚举起点,利用Kruskal求最小生成树,一旦x y连通,则记下此时差值退出从下一起点开始继续找,每次更新差值的最小值


#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int const INF = 0xffffff;
int const MAX = 1005;
int n, m, ans;
int fa[MAX], rank[MAX];
struct Edge
{int u, v, s;
}e[MAX];bool cmp(Edge a, Edge b)
{return a.s < b.s;
}void UFset()
{for(int i = 0; i <= n; i++)fa[i] = i;memset(rank, 0, sizeof(rank));
}int Find(int x)
{return x == fa[x] ? x : fa[x] = Find(fa[x]);
}void Union(int a, int b)
{int r1 = Find(a);int r2 = Find(b);if(r1 == r2)return;if(rank[r1] > rank[r2])fa[r2] = r1;else{fa[r1] = r2;if(rank[r1] == rank[r2])rank[r1]++;}
}void Kruskal(int v0, int x, int y)
{UFset();for(int i = v0; i < m; i++){Union(e[i].u, e[i].v);if(Find(x) == Find(y)){ans = min(ans, e[i].s - e[v0].s);return;}}
}int main()
{while(scanf("%d %d", &n, &m) != EOF){for(int i = 0; i < m; i++)scanf("%d %d %d", &e[i].u, &e[i].v, &e[i].s);sort(e, e + m, cmp);int q, x, y;scanf("%d", &q);while(q--){ans = INF;scanf("%d %d", &x, &y);for(int i = 0; i < m; i++)Kruskal(i, x, y);printf("%d\n", ans == INF ? -1 : ans);}}
}





这篇关于HDU 1598 find the most comfortable road (Kruskal + 枚举)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829790

相关文章

WDF驱动开发-WDF总线枚举(一)

支持在总线驱动程序中进行 PnP 和电源管理 某些设备永久插入系统,而其他设备可以在系统运行时插入和拔出电源。 总线驱动 必须识别并报告连接到其总线的设备,并且他们必须发现并报告系统中设备的到达和离开情况。 总线驱动程序标识和报告的设备称为总线的 子设备。 标识和报告子设备的过程称为 总线枚举。 在总线枚举期间,总线驱动程序会为其子 设备创建设备对象 。  总线驱动程序本质上是同时处理总线枚

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i

【Linux系列】find命令使用与用法详解

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等常用开发工具系列:常用的开发工具,IDEA,M

Leetcode 3195. Find the Minimum Area to Cover All Ones I

Leetcode 3195. Find the Minimum Area to Cover All Ones I 1. 解题思路2. 代码实现 题目链接:3195. Find the Minimum Area to Cover All Ones I 1. 解题思路 这一题还是挺简单的,只要找到所有1所在的元素的上下左右4个边界,作为目标矩形的四个边即可。 2. 代码实现 给出python

「Debug R」报错unable to find an inherited method for function是如何产生的

在一个群里看到这样一条报错,截图如下: 报错信息 当然这种问题解决起来也很快,无非就是把报错信息复制出来放在搜索引擎上,只不过你要挑选合适的搜索引擎。 百度 谷歌 必应 解决方案就是用dplyr::select。 虽然报错解决了,但是我还想着要重复出这个报错。因为只有能重复出报错,才能证明你不是运气好才解

IOS Swift 从入门到精通:数组,集合,元组,对比,字典,枚举

目录 数组 集合 元组 Arrays vs sets vs tuples 字典  字典默认值 创建空集合 枚举 枚举关联值 枚举原始值 复杂类型:总结 数组 数组是存储为单个值的值的集合。例如,John、Paul、George 和 Ringo 是姓名,但数组可让您将它们分组为单个值,即 The Beatles。 在代码中我们这样写: let john

HDU_1013

这个题目尤其需要注意的是开始输入的时候的数的大小,开始输入时有可能非常的大超过了长整型的范围,所以不能开始用整形来存放输入的,,就是开始的时候没有注意到这个问题所以开始的时候一直没有AC,后来就是用一个数组接收输入,然后在经过第一步转化之后就可以用一个整数来装了 #include <iostream>#include <stdlib.h>#include <string>usin

java基础知识枚举提取公共类

引用地址:今日头条 如何规范化Enum在项目中的使用? 2022-03-02 14:14·老顾聊技术 前言 在我们平时开发过程中,枚举的使用时必不可少的。 为什么要用枚举? 有穷序列的字段用int或tinyint不是挺好吗? 答案很简单:我们的程序写给人看的。 既然是写给人看,那么,可理解、易理解往往显得相当重要! 枚举一般有两部分,一个是枚举项值,一个是枚举描述。那么,这两个

道路 Road(百练,POJ)

题目链接: 1724 -- ROADS (poj.org) 题目描述: 思路: 这题目乍一看,是一个含有2个标尺的单源最短路问题,挺难处理的。 既然没法直接用最短路处理,那我们就“记录信息”,将花费的时间也记录进dp数组,然后跑“状态最短路”。 用f[i][j] 表示到达点i 且 总花费时间为j的最短距离,然后跑堆优化的dijkstra算法就好。由于不含有负边权,因此可以搞一个vis数