传送门:

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

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 33731    Accepted Submission(s): 9888

Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
 
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
 
Output
输出 一行有两个数, 最短距离及其花费。
 
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
 
Sample Output
9 11
 
Source
 
分析:
迪杰斯特拉算法,写了很久,终于理解了这句话:
如果最短距离有多条路线,则输出花费最少的。
同时也要注意有重边的情况
代码如下:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define max_v 1005
  4. #define INF 99999
  5. int edge[max_v][max_v];
  6. int v[max_v][max_v];
  7. int n,m;
  8. int used[max_v];
  9. int dis[max_v];
  10. int cost[max_v];
  11. void init()
  12. {
  13. memset(used,,sizeof(used));
  14. for(int i=; i<=n; i++)
  15. {
  16. for(int j=; j<=n; j++)
  17. {
  18. edge[i][j]=INF;
  19. v[i][j]=INF;
  20. }
  21. dis[i]=INF;
  22. cost[i]=INF;
  23. }
  24. }
  25. void Dijkstra(int s)
  26. {
  27. for(int i=; i<=n; i++)
  28. {
  29. dis[i]=edge[s][i];
  30. cost[i]=v[s][i];
  31. }
  32. dis[s]=;
  33. cost[s]=;
  34. for(int i=; i<=n; i++)
  35. {
  36. int index,mindis=INF,mincost=INF;
  37. for(int j=; j<=n; j++)
  38. {
  39. if(used[j]==&&dis[j]<mindis)
  40. {
  41. mindis=dis[j];
  42. mincost=cost[j];
  43. index=j;
  44. }
  45. else if(used[j]==&&dis[j]==mindis&&cost[j]<mincost)//如果最短距离有多条路线,则输出花费最少的。
  46. {
  47. mindis=dis[j];
  48. mincost=cost[j];
  49. index=j;
  50. }
  51. }
  52. used[index]=;
  53. for(int j=; j<=n; j++)
  54. {
  55. if(dis[index]+edge[index][j]<dis[j])
  56. {
  57. dis[j]=dis[index]+edge[index][j];
  58. cost[j]=cost[index]+v[index][j];
  59. }
  60. else if(dis[index]+edge[index][j]==dis[j])//如果最短距离有多条路线,则输出花费最少的。
  61. {
  62. if(cost[index]+v[index][j]<cost[j])
  63. {
  64. cost[j]=cost[index]+v[index][j];
  65. }
  66. }
  67.  
  68. }
  69. }
  70. }
  71. int main()
  72. {
  73. while(~scanf("%d %d",&n,&m))
  74. {
  75. if(n==&&m==)
  76. break;
  77. init();
  78. for(int i=; i<m; i++)
  79. {
  80. int a,b,c,d;
  81. scanf("%d %d %d %d",&a,&b,&c,&d);
  82. if(edge[a][b]>c)//预防重边
  83. {
  84. edge[a][b]=edge[b][a]=c;
  85. v[a][b]=v[b][a]=d;
  86. }
  87. }
  88. int x,y;
  89. scanf("%d %d",&x,&y);
  90. Dijkstra(x);
  91. printf("%d %d\n",dis[y],cost[y]);
  92. }
  93. }

HDU 3790(两种权值的迪杰斯特拉算法)的更多相关文章

  1. HDU 1874畅通工程续(迪杰斯特拉算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)     ...

  2. HDU 2680 最短路 迪杰斯特拉算法 添加超级源点

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. HDU 2544最短路 (迪杰斯特拉算法)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others)    Me ...

  4. 【算法杂谈】LJX的迪杰斯特拉算法报告

    迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...

  5. 迪杰斯特拉算法——PAT 1003

    本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...

  6. dijkstra算法(迪杰斯特拉算法)

    dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...

  7. Dijkstra【迪杰斯特拉算法】

    有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...

  8. 单源最短路径算法——Dijkstra算法(迪杰斯特拉算法)

    一 综述 Dijkstra算法(迪杰斯特拉算法)主要是用于求解有向图中单源最短路径问题.其本质是基于贪心策略的(具体见下文).其基本原理如下: (1)初始化:集合vertex_set初始为{sourc ...

  9. 最短路径之迪杰斯特拉算法的Java实现

    Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...

随机推荐

  1. 理解bind函数

    前言:之前一直不懂这个函数是干嘛的,最近慢慢有点懂了,说一说自己的理解~ 本文按以下3个方面来谈谈bind函数 1)对bind函数的理解: 2)如何使用bind函数 3)自定义bind函数 (http ...

  2. Sql语句常用关键字

    --语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据 --数 ...

  3. hihernate一对多关联映射

    hihernate一对多关联映射 一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端 ...

  4. Java Web高性能开发 - 前端高性能

    作者:IBM developerWorks链接:https://www.ibm.com/developerworks/cn/java/j-lo-javawebhiperf1/著作权归作者所有.商业转载 ...

  5. iTextSharp 使用详解(转) 感谢原著作者 .

    TextSharp是一个生成Pdf文件的开源项目,最近在项目中有使用到这个项目,对使用中的经验作一个小结. ITextSharp中相关的概念: 一.Document 这个对象有三个构造函数: 隐藏行号 ...

  6. Facebook POP 使用指南

    Facebook POP 使用指南 Pop是一个动画引擎,用以扩展iOS.OSX的动画类型.相较于iOS.OSX中的基本动画效果,Pop扩展后支持弹簧动画效果与衰减动画效果,你可以用Pop动画引擎来构 ...

  7. Google论文(1) GFS:Google文件系统 - 思维导图

    Google文件系统是一个面向大规模分布式数据密集型应用的可扩展分布式文件系统. 这里的思维导图作为个人的读书笔记.   参考资料: <google系列论文>- GFS

  8. Linux 下LAMP环境搭建_【all】

    LAMP = Linux + Apache + Mysql + PHP 0. Linux环境搭建 Linux 系统安装[Redhat] 1.http服务软件分类及企业实战用途介绍 静态程序: Apac ...

  9. 进程&多道技术

    进程 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都 ...

  10. 乘风破浪:LeetCode真题_013_Roman to Integer

    乘风破浪:LeetCode真题_013_Roman to Integer 一.前言 上一节我们讨论了如何把阿拉伯数字转换成罗马数字,现在我们需要思考一下如何把罗马数字转换成阿拉伯数字,其实我们仔细观擦 ...