题目链接:

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

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
 题意描述:
输入顶点的个数n和道路的条数m以及起始点数s和t((1<n<=1000, 0<m<100000, s != t))
计算并输出最短距离及其花费(如果最短路径数相同,输出花费最小)
解题思路:
哇,读到这个题,心想求最短路径和最小花费,直接两边DijkstraOK,直接WA。
后来想想,先要保证路径最短,那么就先求最短路径,Dijkstra不变,只不过最后更新的时候处理一下最小花费就行了,具体处理方法见代码。
另外,既然存在路径相同而花费不同,那么必然输入数据存在两顶点相同,路径相同,但花费不同的数据,所以输入的时候我们只保留相同情况下花费最小即可。
题目很经典,如需了解
最长路径最小权值 请参考博客:http://www.cnblogs.com/wenzhixin/p/7336948.html
最短路径最大权值 请参考博客:http://www.cnblogs.com/wenzhixin/p/7406333.html
AC代码:
  1. #include<stdio.h>
  2. int e1[][],e2[][];
  3. int inf=,n,m,s,t;
  4. void Dijkstra();
  5. int main()
  6. {
  7. int i,j,t1,t2,t3,t4;
  8. while(scanf("%d%d",&n,&m), n+m != )
  9. {
  10. for(i=;i<=n;i++)//全部初始化为inf
  11. for(j=;j<=n;j++)
  12. e1[i][j]=e2[i][j]=inf;//i和j
  13.  
  14. for(i=;i<=m;i++)
  15. {
  16. scanf("%d%d%d%d",&t1,&t2,&t3,&t4);
  17. if(e1[t1][t2] > t3)//存储的时候就去重,先保证路径最短,否则如
  18. //果相等且花费变小则更新花费
  19. {
  20. e1[t1][t2]=e1[t2][t1]=t3;//双向
  21. e2[t1][t2]=e2[t2][t1]=t4;
  22. }
  23. else if(e1[t1][t2] == t3 && e2[t1][t2] > t4)
  24. e2[t1][t2]=e2[t2][t1]=t4;
  25. }
  26. scanf("%d%d",&s,&t);
  27.  
  28. Dijkstra();
  29. }
  30. return ;
  31. }
  32. void Dijkstra()
  33. {
  34. int i,j,u,v,min,d[],c[],book[];
  35. for(i=;i<=n;i++)
  36. {
  37. d[i]=e1[s][i];
  38. c[i]=e2[s][i];
  39. }
  40. for(i=;i<=n;i++)
  41. book[i]=;//初始化为0
  42. book[s]=;
  43.  
  44. for(i=;i<=n-;i++)
  45. {
  46. min=inf;
  47. for(j=;j<=n;j++)
  48. {//找到距离s点最近的尚未访问的点
  49. if(!book[j] && d[j] < min)
  50. {
  51. min=d[j];
  52. u=j;
  53. }
  54. }
  55. book[u]=;
  56. for(v=;v<=n;v++)//遍历每个顶点
  57. {
  58. if(!book[v] && e1[u][v] < inf)
  59. {//加入点U后,更新每个顶点到s的距离为最近,便于下次查找
  60. if(d[v] > d[u]+e1[u][v])
  61. {//和之前的去重一样,在保证最短路径且花费减少时 才更新最小花费
  62. d[v]=d[u]+e1[u][v];
  63. c[v]=c[u]+e2[u][v];
  64. }
  65. else if(d[v] == d[u]+e1[u][v] && c[v] > c[u]+e2[u][v])
  66. c[v] = c[u]+e2[u][v];
  67. }
  68. }
  69. }
  70. printf("%d %d\n",d[t],c[t]);
  71. }

POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)的更多相关文章

  1. POJ 2253 Frogger(Dijkstra变形——最短路径最大权值)

    题目链接: http://poj.org/problem?id=2253 Description Freddy Frog is sitting on a stone in the middle of ...

  2. POJ 1797 Heavy Transportation(Dijkstra变形——最长路径最小权值)

    题目链接: http://poj.org/problem?id=1797 Background Hugo Heavy is happy. After the breakdown of the Carg ...

  3. POJ.1797 Heavy Transportation (Dijkstra变形)

    POJ.1797 Heavy Transportation (Dijkstra变形) 题意分析 给出n个点,m条边的城市网络,其中 x y d 代表由x到y(或由y到x)的公路所能承受的最大重量为d, ...

  4. POJ 3565 Ants 【最小权值匹配应用】

    传送门:http://poj.org/problem?id=3565 Ants Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: ...

  5. POJ 2195 Going Home 【二分图最小权值匹配】

    传送门:http://poj.org/problem?id=2195 Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  6. 【POJ 2400】 Supervisor, Supervisee(KM求最小权匹配)

    [POJ 2400] Supervisor, Supervisee(KM求最小权匹配) Supervisor, Supervisee Time Limit: 1000MS   Memory Limit ...

  7. POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16425   Accepted: 5797 Descr ...

  8. NYOJ 1248 海岛争霸(Dijkstra变形——最短路径最大权值)

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=1248 描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比 ...

  9. POJ - 2253 Frogger(Dijkstra变形题)

    题意: 题目撰写者的英语真是艰难晦涩,看了别人题解,才知道这题题意. 两个forger 一个froger 要蹦到另外一个froger处,他们的最短距离是这样定义的 : The frog distanc ...

随机推荐

  1. LVS-DR集群搭建

    安装LVS 下载源码包,安装时需要根据自己的内核,下载 ipvsadm-1.26.tar.gz的源码包,在进行编译安装以后,我们需要检查必需包是否安装: 1.对内核文件做链接 # uname -r 2 ...

  2. Java NIO (五) 管道 (Pipe)

    Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 如下图: 向管道写数据: 从管道读数据: 1. ...

  3. 解决 mysql 中文乱码

    mysql版本:5.6.38 虽然创建实例时选择的是utf-8的utf8_general_ci,但是用其他程序保存中文时依旧出现乱码的情况. 记录一种可行的解决方案,即修改数据库的字符集. 由于该环境 ...

  4. 响应式布局—设备像素密度测试 (-webkit-min-device-pixel-ratio)

      最近遇到这种头疼的问题,百思不得其解,不耻下问,悬梁刺股这些事情都做过之后,终于看到希望,于是攒见好就收,感觉整理分享给大家,希望有所帮助. 对手机分辨率和网页像素的初步认识是,是2倍的差别. 但 ...

  5. Lambda 表达式,Java中应用Lambda 表达式

    一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...

  6. JS中闭包、函数与对象的介绍和用法

    闭包 闭包概念:当一个内部函数被调用,就会形成闭包,闭包就是能够读取其他函数内部变量的函数,定义在一个函数内部的函,创建一个闭包环境,让返回的这个子程序抓住i,以便在后续执行时可以保持对这个i的引用. ...

  7. 又趟一个坑,IO卡信号DI和DO的信号类型

    工控IO卡可以感应到各种电信号,传感器的状态变化. DI信号包括数字开关信号(ture,false\0,1),光信号的变化(上升沿,下降沿). DO信号包括脉宽和数字开关信号(ture,false\0 ...

  8. linux下一键安装redis并设置为后台进程及开机启动

    1.下载适合你的版本的redis(下载页面https://redis.io/download),我下载的是4.0.6版本 wget http://download.redis.io/releases/ ...

  9. SSM框架开发web项目系列(六) SpringMVC入门

    前言 我们最初的javaSE部分学习后,基本算是入门了,也熟悉了Java的语法和一些常用API,然后再深入到数据库操作.WEB程序开发,渐渐会接触到JDBC.Servlet/Jsp之类的知识,期间可能 ...

  10. ML笔记_机器学习基石01

    1  定义 机器学习 (Machine Learning):improving some performance measure with experience computed from data ...