背景
话说WZOI 的MWH 十分爱好运动,就在这NOIP 即将到来的日子里,也要坚持每天早上去锻炼。。。
问题描述
这一天MWH 到附近的山上去慢跑,这座山上有N 个凉亭,简单地编号为1 到N(山顶的凉亭编号为N,山底的凉亭编号为1)。有趣的是,如果凉亭i 和凉亭j 满足i<j,那么凉亭j的海拔高度就大于凉亭i 的海拔高度。这些凉亭中存在一些道路,连接两个海拔不同的凉亭,穿过一条道路需要花一定的时间。但这里还有一个十分诡异的事件,这里存在一些特殊道路。从这些道路经过MWH 可以回到过去,也就是说MWH 需要花的时间为负值。通过这些道路,MWH 可以花较短的时间跑完他需要跑的路程。这样他就可以节约下许多时间,回到机房刷水题。MWH 想从凉亭1 跑到凉亭N 去,但他不想走下坡路,也就是说他想要走一条海拔递增的路径,因为MWH 始终认为递增的东西是具有美感的。MWH他想知道他最少需要花多少时间就可以从山底的凉亭到达山顶的凉亭?有一点需要注意,MWH 到达山顶的凉亭的时间可能会小于他出发的时间, 这就意味着他穿越了时空。
这是一件多么美妙的事,于是MWH 也想知道他是否能穿越时空。他把这个任务交给了你,他希望你能告诉他他最少需要花多少时间才能到达山顶,同时你也需要告诉他,他是否能穿越时空。
输入格式
输入数据第一行包含三个整数N,ML,MD(分别用一个空格隔开),分别表示凉亭的数目,普通道路的数目和特殊道路的数目;
第2 行到第ML+1 行,每行三个整数Ai,Bi,Ci(分别用一个空格隔开,1≤Ai,Bi≤N,Ai≠Bi),表示普通道路连接凉亭 Ai和 Bi,穿过这条道路需要花时间Ci;
第ML+2 行到第ML+MD+1 行,每行三个整数Ai ,Bi,Ci(分别用一个空格隔开,1≤Ai,Bi≤N,Ai≠Bi),表示特殊道路连接凉亭 Ai 和 Bi,穿过这条道路会回到相对时间Ci 之前。
输出格式
输出数据包含两行。
第一行包含一个整数T,表示MWH 最少花多少时间能到达山顶的凉亭;
第二行包含一个字符串“YES”或“NO”(不包含引号),如果MWH 可以回到过去那么输出“YES”,否则输出“NO”。
样例输入输出
Sample #1
jogging.in
4 3 2
1 2 1
1 3 4
3 4 3
2 4 1
1 4 2
jogging.out 
-2
YES
Sample #2
jogging.in 
5 4 2
2 4 2
2 3 3
3 5 4
4 5 1
1 2 2
1 3 1
jogging.out 
1
NO
数据规模
对于10%的数据,N≤100,0≤ML,MD≤1000,Ci≤100;
对于30%的数据,N≤10000,0≤ML,MD≤30000,Ci≤500;
对于100%的数据,N≤100000,0≤ML,MD≤1000000,Ci≤2000。
输入数据保证从1 到N 会有一条路径。
时间限制
1s
提示
输入格式中的相对时间指:如果到达这条道路的出发点时间为T,那么穿过这条道路后的时间为T-Ci。 

分析:

题目大意:给出一个具有N 的顶点,M 条边的图,要求输出点1 到N 的最短路。
考察算法:有向无环图的单源最短路
算法一 
根据题目的要求我们可以构建出一个有向图G,然后我们在这个图上一边SPFA 就可以求出点1 到点N 的最短路。注意这道题目不能使用Dijkstra 算法,因为我们会发现这个图出现了负权,这使得用贪心算法实现的Dijkstra 算法没有了用武之地。
时间复杂度:O(kM) 空间复杂度:O(N+M) 期望得分:30 分
算法二 
仔细分析一下题目我们可以发现这个有向图G,其实是一个有向无环图。对于有向无环图我们有一个十分高效方法来求得单源最短路,其基本思想是DP。具体实现过程可以见下面的附录,那里又十分详细的介绍。

时间复杂度:O(N+M) 空间复杂度:O(N+M) 期望得分:100 分

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100005,maxm=2000005,INF=2000000000;
int dis[maxn],head[maxn],n,ml,md,cnt=0;
struct eadge
{int next,to,dist;
} e[maxm];
void add(int from,int to,int dist)
{e[++cnt].next=head[from];e[cnt].to=to;e[cnt].dist=dist;head[from]=cnt;
}
int main()
{freopen("jogging.in","r",stdin);freopen("jogging.out","w",stdout);scanf("%d%d%d",&n,&ml,&md);int x,y,z;for(int i=1;i<=ml;i++){scanf("%d%d%d",&x,&y,&z);if(x<y) add(x,y,z);else add(y,x,z);}for(int i=1;i<=md;i++){scanf("%d%d%d",&x,&y,&z);if(x<y) add(x,y,-z);else add(y,x,-z);}for(int i=1;i<=n;i++)dis[i]=INF;dis[1]=0;for(int i=1;i<=n;i++){if(dis[i]!=INF){for(int j=head[i];j;j=e[j].next){int to=e[j].to;if(dis[to]>dis[i]+e[j].dist)dis[to]=dis[i]+e[j].dist;}}}printf("%d\n",dis[n]);if(dis[n]<0) printf("YES\n");else printf("NO\n");fclose(stdin);fclose(stdout);return 0;
}

当然用直接用spfa也是不会错的,但要比上一种算法要慢一点。
关于慢跑问题的说明:

这道题目主要为了考察有向无环图的单源最短路。下面来详细介绍着这种算法:
适用条件和范围:
1) DAG(Directed Acyclic Graph,有向无环图);
2) 边权可正可负。
算法描述:
1) Toposort
2) If Toposort=False Then HALT(Not a DAG)
3) For 拓扑序的每个顶点u do
For u的每个邻接点v do
Relax(u,v,w);
算法结束后:如有环则输出错误信息;否则dis[i]为s到i的最短距离,pre[i]
为前驱顶点。
算法补充:
此算法时间复杂度O(V+E),时间和编程复杂度低,如遇到符合条件的题目(DAG),推荐使用。还有,此算法的步骤可以在Toposort中实现,这样即减小了此算法复杂度的一个系数。
其实这道题目还有许多地方需要注意:
1) 输入数据给出的图并不是有向图,当然更不是有向无环图,我们需要根据题目隐藏的条件将这个图构建成有向无环图;
2) 题目已经说明一定要从编号小的凉亭跑到编号大的凉亭,这就意味这我们完全不需要进行拓扑排序,因为数据关系已经具有拓扑关系了。我们只需要从1到N进行DP即可。  

Problem 2 慢跑问题相关推荐

  1. linux下yum错误:[Errno 14] problem making ssl connection Trying other mirror.

    所有的base 都要取消注释 mirrorlist 加上注释 另外所有的enable都要设为零 目录 今天是要yum命令安装EPEL仓库后 yum install epel-release 突然发现y ...

  2. A + B Problem

    1001: A + B Problem Description 计算 A + B. Input 多组测试数据,每组测试数据占一行,包括2个整数. Output 在一行中输出结果. Sample Inp ...

  3. Error:(49, 1) A problem occurred evaluating project ':guideview'. Could not read script 'https://r

    出现问题如下: Error:(49, 1) A problem occurred evaluating project ':guideview'. > Could not read script ...

  4. #418 Div2 Problem B An express train to reveries (构造 || 全排列序列特性)

    题目链接:http://codeforces.com/contest/814/problem/B 题意 : 有一个给出两个含有 n 个数的序列 a 和 b, 这两个序列和(1~n)的其中一个全排列序列 ...

  5. ADPRL - 近似动态规划和强化学习 - Note 3 - Stochastic Infinite Horizon Problem

    Stochastic Infinite Horizon Problem 3.Stochastic Infinite Horizon Problem 定义3.1 无限范围的马尔可夫决策过程 (Marko ...

  6. ADPRL - 近似动态规划和强化学习 - Note 2 - Stochastic Finite Horizon Problem

    2. Stochastic Finite Horizon Problem 在这一节中主要介绍了随机DP算法来解决不确定性下的有限地范围问题,如Denition 1.4所述,它被表述为一个组合优化问题. ...

  7. There was a problem confirming the ssl certificate ……

    在安装一个Python库onetimepass时发生下面的问题: pip install onetimepass Could not fetch URL https://pypi.python.org ...

  8. HDU 1757 A Simple Math Problem

    Problem Description Lele now is thinking about a simple function f(x). If x < 10 f(x) = x. If x & ...

  9. The C10K problem原文翻译

    原文地址:http://www.cnblogs.com/fll/archive/2008/05/17/1201540.html The C10K problem 如今的web服务器需要同时处理一万个以 ...

  10. This is probably not a problem with npm. There is likely additional logging output above

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. E:\weii_objct\invoice-manage-web-view>npm start > ...

最新文章

  1. Linux 进程管理工具
  2. MATLAB时间序列的排序函数
  3. 【数据结构总结】第六章 图(非线性结构)
  4. JS运行机制(浏览器内核)
  5. python中的装饰器-(重复阅读)
  6. arcgis报错常用解决方法
  7. 数据结构链表之单链表的快慢指针——3
  8. THUSCH 2017 大魔法师(矩阵乘法+线段树)
  9. jQuery常用知识点总结以及平时封装常用函数
  10. SpringBoot项目在Gitee的控管步骤
  11. 详尽解读中美科技差距究竟多么巨大
  12. 烟台市计算机二级培训机构,烟台市2020年3月计算机二级报名时间|网上报名入口【12月20日9:00开通】...
  13. P6039A高压衰减棒使用方法及注意事项
  14. eclipse插件下载及使用
  15. 手摸手。完成一个H5 抽奖功能
  16. 计算机系统时间无法更改,电脑时间改不了,小编教你电脑无法修改系统时间如何解决...
  17. html图片轮播15个自动,15个超强的jQuery/HTML5图片轮播插件
  18. web网页设计期末课程大作业 基于HTML+CSS+JavaScript响应式环保科技公司网站模板(环保主题网站设计)
  19. hao.360.cn不停跳....
  20. 加密币Terra创始人权道亨已从新加坡飞往杜拜转往第三国

热门文章

  1. 【模型检测学习笔记】8:无限字上ω正则LT性质的验证
  2. 微信公众号访问 ssm框架根目录下MP_verify_xxxxxx.txt的解决方法
  3. windows7旗舰版序列号[经测试,第一枚即可完成升级!]
  4. 百度谷歌搜索引擎研究,如何做SEO优化?网站优化实操(程序员必看)
  5. 如何提高阅读源代码能力
  6. linux鼠标怎么取出来,浅析linux中鼠标数据读取
  7. 文件共享服务器(CIFS协议)
  8. Photoshop制作3D水晶按钮
  9. Python4班平均成绩统计_空中交通管理学院2017级学生 20182019学年第一学期成绩分析报告...
  10. 实验一 网络侦查与网络扫描