题意:有R条路,每条路都有一定的路长和花费,问在总的花费小于一定的值的情况下,从1到N的最短路程
         注意:这里两点之间单向边,且可能存在很多条路,所以只能用邻接表存储。
思路:用dijkstra,但是每次判断一个元素是否能进入队列,并不是源点到它的距离被更新了才入队,
  而是只要满足从源点到该点总的路费小于给定的值,都可入队。
  每次从优先级队列中取出路程最小(如果路程相同,取花费最小)的点。
  当N点被取出来时,直接结束

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <string>
  6. #include <vector>
  7. #include <queue>
  8. using namespace std;
  9. const int maxn=0x3f3f3f3f;
  10.  
  11. int money,n,r,a,b,l,toll,t;
  12. int ans,tot;
  13.  
  14. struct Road{
  15. int next,from,to;
  16.  
  17. }road[];
  18.  
  19. int head[];
  20. int rlength[]; //每条路的路长
  21. int cost[]; //每条路的花费
  22.  
  23. struct State{
  24. //u到1点的总的花费(cost)、路长(dis)
  25. int u;
  26. int cost,dis;
  27. void init(int uu,int costt,int diss){
  28. u=uu;
  29. cost=costt;
  30. dis=diss;
  31. }
  32.  
  33. bool operator < (const State tmp) const
  34. {
  35. if(dis==tmp.dis)
  36. return cost>tmp.cost;
  37. else
  38. return dis>tmp.dis;
  39. //如果dis<tmp.dis,则为从小到大排,但这样的话优先级队列取得是最大的,它默认的就是最大堆,取排在最后的
  40. }
  41. };
  42.  
  43. void add(int a,int b,int ll,int tt){
  44. road[tot].next=head[a];
  45. road[tot].from=a;
  46. road[tot].to=b;
  47. rlength[tot]=ll;
  48. cost[tot]=tt;
  49. head[a]=tot++;
  50. }
  51.  
  52. void dijastra(){
  53. int idx;
  54. State temp,minNode,node;
  55. priority_queue<State> q;
  56. while(!q.empty()) q.pop();
  57. //dis[1]=0;
  58. //vis[1]=1;
  59. temp.init(,,);
  60. q.push(temp);
  61. while(!q.empty()){
  62. minNode=q.top();
  63. q.pop();
  64. idx=minNode.u;
  65. if(idx==n){
  66. ans=minNode.dis;
  67. break;
  68. }
  69. for(int k=head[idx];k!=-;k=road[k].next){
  70. int v=road[k].to;
  71. if(minNode.cost+cost[k]<=money){
  72. node.init(v,minNode.cost+cost[k],minNode.dis+rlength[k]);
  73. q.push(node);
  74. }
  75. }
  76. }
  77. }
  78.  
  79. int main()
  80. {
  81. scanf("%d",&t);
  82. for(int i=;i<=t;i++){
  83. ans=maxn;
  84. tot=;
  85. memset(head,-,sizeof(head));
  86.  
  87. scanf("%d",&money);
  88. scanf("%d",&n);
  89. scanf("%d",&r);
  90.  
  91. for(int i=;i<=r;i++){
  92. scanf("%d%d%d%d",&a,&b,&l,&toll);
  93. add(a,b,l,toll);
  94. }
  95. dijastra();
  96. if(ans==maxn)
  97. printf("-1\n");
  98. else
  99. printf("%d\n",ans);
  100. }
  101. return ;
  102. }

POJ 1724 Roads的更多相关文章

  1. 深搜+剪枝 POJ 1724 ROADS

    POJ 1724 ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12766   Accepted: 4722 D ...

  2. poj 1724 ROADS 很水的dfs

    题意:给你N个城市和M条路和K块钱,每条路有话费,问你从1走到N的在K块钱内所能走的最短距离是多少 链接:http://poj.org/problem?id=1724 直接dfs搜一遍就是 代码: # ...

  3. poj 1724 ROADS 解题报告

    题目链接:http://poj.org/problem?id=1724 题目意思:给出一个含有N个点(编号从1~N).R条边的有向图.Bob 有 K 那么多的金钱,需要找一条从顶点1到顶点N的路径(每 ...

  4. poj 1724:ROADS(DFS + 剪枝)

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10777   Accepted: 3961 Descriptio ...

  5. POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)

    题目链接: https://cn.vjudge.net/problem/POJ-1724 N cities named with numbers 1 ... N are connected with ...

  6. POJ 1724 ROADS【最短路/搜索/DP】

    一道写法多样的题,很具有启发性. 具体参考:http://www.cnblogs.com/scau20110726/archive/2013/04/28/3050178.html http://blo ...

  7. DFS(剪枝) POJ 1724 ROADS

    题目传送门 题意:问从1到n的最短路径,同时满足花费总值小于等于k 分析:深搜+剪枝,如果之前走过该点或者此时的路劲长度大于最小值就不进行搜索. /************************** ...

  8. POJ 1724 ROADS(二维SPFA)

    题目链接 用STL实现超时了,用普通队列500+,看到spfa,反应太迟钝了. #include <cstring> #include <cstdio> #include &l ...

  9. POJ 1724 ROADS(BFS+优先队列)

    题目链接 题意 : 求从1城市到n城市的最短路.但是每条路有两个属性,一个是路长,一个是花费.要求在花费为K内,找到最短路. 思路 :这个题好像有很多种做法,我用了BFS+优先队列.崔老师真是千年不变 ...

随机推荐

  1. log4j自动生成日志文件配置

    生成文件到默认位置: #生成日志文件 #log4j.appender.systemFile=org.apache.log4j.RollingFileAppender #按天生成 log4j.appen ...

  2. 编译内核模块出现error: negative width in bit-field 错误

    今天在写一个简单的内核测试模块的时候出现了一个挺奇怪的问题,网上查了一下也没人解决,自己试了好久终于解决了,所以分享出来供大家参考,先贴出源码: /************************** ...

  3. JQuery window.opener

    $('#Save').click(function () {    var parent = $(parent.document.body);    $(parent).find('input#add ...

  4. SequoiaDB数据库的一般概念介绍

    SequoiaDB数据库的主要对象包括文档.集合.集合空间与索引等. 文档 SequoiaDB中的文档为JSON格式,一般又被称为记录.在数据库内部使用BSON,即二进制的方式存放JSON数据.一般情 ...

  5. Maven入门指南⑤:使用Nexus搭建Maven私服

    1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部 ...

  6. js中(function(){…})()立即执行函数写法理解(转载oschina)

    ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到 ...

  7. Linux 使用退格键时出现^H解决方法

    当我们再和脚本交互的时候,在终端上输错了内容,使用退格键,屏幕上会出现乱码,比如 ^H.^H不是H键的意思,是backspace. 主要是当你的终端backspace有问题的时候才需要设置. 解决方法 ...

  8. MVC 5.0(or5.0↓) Ajax.BeginForm 异步上传附件问题,答案是不能的!

    MVC 5.0(or5.0↓)  Ajax.BeginForm 异步上传附件问题,答案是不能的! (请注意我这里说的异步!) 来看一下下面这段一步提交file的代码 //前台 .cshtml 文件 & ...

  9. IAR修改工程名称Tab键设置模板建立

    IAR 修改工程名称 很多时候用IAR开发都是基于已有工程模板开发的,但是工程模板的名称经常让人头疼:以下是修改办法: 从一个实例工程复制后缀名为"dep,ewd,ewp,eww" ...

  10. [ERROR] Failed to open log

    版本:5.5.14 性能测试部-测试环境数据库 1.在性能测试过程中大量的日志,测试人员直接使用 rm -rf 删除所有 2.重启数据库时,出现报错,导致数据库无法启动,查看报错日志,报错信息如下: ...