http://acm.hdu.edu.cn/showproblem.php?pid=1598

find the most comfortable road

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

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

思路:

这里我们应用了Kruscal的思想

我们都知道,Kruscal是把边权排序,然后从小到大依次并查集加边(判环),最终形成最小生成树的

而这个题呢  因为要求的是一条路径的最大速度和最小速度之差

如果你朴素做法的话,DFS找一条路,并且记忆化搜索,拿到最大速度and最小速度。

这样找下来,虽然这个图不大,但找出所有路并计算,复杂度也太高了。

我们换一种想法,边权就是速度,按照Krusal的思想,把边权排序,依次加边,

这样的话集合里的边,最大速度和最小速度就是第一个加进去的和最后一个加进去的,

每次加边的时候通过并查集判断起点和终点是否联通,若联通了,就直接ans=最大速度减去最小速度

但是这样做还有一个问题:

比如  这样

1-->2 val=1

2-->3 val=2

3-->4 val=3

起点:2 终点:4

按照我们的思路肯定是依次这三条边依次加进去,但是第三次我们才会判断到2和4联通了,但是我们记录的最小值却是1-->2的val,我们的ans=3-1=2,起点边错了导致答案错了。但是终点边是不会错的,一定会是我们需要的最大速度。

所以我们需要再外边再套一层循环,枚举起点边,就好了。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn=203;
const int INF=0x3f3f3f3f;
struct Eage{int from,to,val;friend bool operator<(const Eage&a,const Eage &b){return a.val<b.val;}
}a[maxn*maxn];
int fa[maxn];
int init(){for(int i=0;i<=maxn;i++)fa[i]=i;
}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);
}
int Union(int a,int b){int p1=find(a),p2=find(b);fa[p2]=p1;
}
int n,m,q,st,ed;
int main(){while(cin>>n>>m){for(int i=0;i<m;i++){cin>>a[i].from>>a[i].to>>a[i].val;}sort(a,a+m);cin>>q;while(q--){cin>>st>>ed;int ans=INF;for(int i=0;i<m;i++){init();//枚举起点边for(int j=i;j<m;j++){Union(a[j].from,a[j].to);if(find(st)==find(ed)){ans=min(ans,a[j].val-a[i].val);break;}}}if(ans==INF)cout<<"-1"<<endl;else cout<<ans<<endl;}}return 0;
}

hdu1598-----Kruscal+枚举相关推荐

  1. HDU1598 find the most comfortable road【枚举+并查集+最大生成树】

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...

  2. 货车运输--kruscal重构树板子

    前置知识: kruscal重构树 用于求解有关两点间路径最大边权最小值和最小边权最大值问题 求解两点间路径最大边权最小值--最大生成树思想,优先选择权值大的边 求解两点间路径最小边权最大值--最小生成 ...

  3. 【C#】枚举_结构体_数组

    最近看C#视频,关于这部分,先看了一遍,又照着敲了一遍,自己敲的过程发现了一些有意思的东西. 枚举:定义一个枚举类型的变量,这个变量有很多相同类型的值.比如性别Gender这个变量可以有男和女这两个值 ...

  4. Go 学习笔记(7)— 常量定义、常量使用、枚举用法、iota 常量、不设置初始值常量

    1. 常量定义及分类 1.1 定义 常量是指在程序运行时,不会被修改的量. 常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型. 常量的定义格式: const identifie ...

  5. 1137 - Sin your life sin公式 + 枚举

    http://www.ifrog.cc/acm/problem/1137 和差化积公式, 变成2 * sin((x + y) / 2) * cos((x - y) / 2) + sin(n - (x ...

  6. C语言程序设计 细节总结(第9章 结构体共用体枚举)

    第9章 结构体.共用体.枚举 9.1 结构体 1.对于同类型结构体变量之间可以整体一次赋值 9.2 指向结构体的指针 9.2.1结构体变量的指针 1.定义格式:struct 结构体名 *结构体指针变量 ...

  7. java 枚举的继承_java中枚举类可以被继承吗?

    java 枚举类 java中,使用关键字enum来定义枚举类,枚举类是一个特殊的类,大部分功能和普通类是一样的,区别为: ● 枚举类继承了java.lang.Enum类,而不是默认的Object类.而 ...

  8. c语言枚举3位数相加等于10,C语言 联合和枚举

    联合(union): 一.联合说明和联合变量定义 联合也是一种新的数据类型, 它是一种特殊形式的变量. 联合说明和联合变量定义与结构十分相似.其形式为: union 联合名 { 数据类型 成员名; 数 ...

  9. Codeforces Round #359 (Div. 2) C. Robbers' watch 暴力枚举

    题目链接 题意是真的烦,到最后才知道是n个m其实就是限定表的两个时区的位数,所以所当数不够填满时区的时候前边自动补零 思路:首先来说不能有重复的数字的话,小时和分钟的总位数大于7肯定不行. 7的7次方 ...

  10. 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

        新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

最新文章

  1. 行业 平均年龄_2019中国“新生力”白皮书:平均年龄35岁,千万资产家庭达198万户!...
  2. 104. Leetcode 337. 打家劫舍 III (动态规划-打家劫舍)
  3. JavaWeb Cookie详解
  4. 【Matlab】找到矩阵中每个连通域的最小值
  5. TCP流中各种队列:
  6. 搭建java_搭建JAVA环境
  7. python正则匹配ip_[求助] 正则表达式匹配 IP 地址的问题求助
  8. linux ftp安装_Linux 文件共享方案
  9. 【符号修改】之根据静态库符号以#define的形式重命名
  10. 计算机网络实训室建设设备,计算机网络技术综合实训室建设方案.doc
  11. 词法分析与语法分析简介
  12. linux scp命令 将数据从一台linux服务器复制到另一台linux服务器
  13. BUUCTF--[第二章 web进阶]死亡ping命令
  14. 【C++沉思录】代理类
  15. 销售订单(SO)新建BAPI_SALESORDER_CREATEFROMDAT2或修改BAPI_SALESORDER_CHANGE价格条件值扩大或缩小问题解决方法
  16. 点线面的意义_点线面在绘画中的意义
  17. SlidesJS基本使用方法和官方文档解释 【Jquery幻灯片插件 Jquery相册插件】
  18. 如何在ORACLE数据库的字段上建立索引?
  19. MS问题汇总小结~(持续更新记录)
  20. 爬虫day3,通过爬虫有道翻译实现汉译英

热门文章

  1. proxy_set_header的设置
  2. MongoDB实战-面向文档的数据(找到最合适的数据建模方式)
  3. 腾讯正式开源高性能Hybrid框架VasSonic!
  4. 2017-07-08 前端日报
  5. 内容分发网络(CDN)关键技术、架构与应用(一)
  6. 作为移动开发者,你应该了解Baas(后端即服务)
  7. 初学linux网络服务之DHCP实验
  8. 聊聊reactive streams的schedulers 1
  9. 一文读懂质量保证和质量控制
  10. 关于background的一些知识