一道最短路问题。普通最短路问题的边只有一种权值,而此题的边要考虑两种权值。因为节点n<=1000,所以不能够使用Floyd算法,时间复杂度较高,这里使用Dijkstra算法解决。

中文描述,题意不再赘述。只是要注意每条边都有距离和花费两种权,当且仅当两条边的距离相等时才比较花费。因为需要考虑两种权,所以算法代码要有相应的改变。另外,要考虑重边的问题,依旧要考虑两种权值。

下面是解题代码:Dijkstra解法

  1 #include <stdio.h>
  2 #define N 1001
  3 #define INF 9999999
  4
  5 int map[N][N];      /*距离图*/
  6 int cost[N][N];     /*花费图*/
  7 int dis[N];         /*起点到i的距离*/
  8 int cos[N];         /*起点到i的花费*/
  9 int flag[N];        /*标志变量*/
 10 int n, m;
 11 int s, t;
 12
 13 void Init();    /*初始化*/
 14
 15 void Read();    /*输入*/
 16
 17 void Dijkstra();
 18
 19 int main()
 20 {
 21     while (~scanf("%d %d", &n, &m))
 22     {
 23         if (n == 0 && m == 0)
 24         {
 25             break;
 26         }
 27         Init();
 28         Read();
 29         Dijkstra();
 30         printf("%d %d\n", dis[t], cos[t]);
 31     }
 32     return 0;
 33 }
 34
 35 void Init()     /*初始化*/
 36 {
 37     int i, j;
 38     for (i=1; i<=n; ++i)
 39     {
 40         for (j=1; j<=n; ++j)
 41         {
 42             map[i][j] = cost[i][j] = INF;
 43         }
 44         dis[i] = cos[i] = INF;
 45         flag[i] = 0;
 46     }
 47     return;
 48 }
 49
 50 void Read()     /*输入*/
 51 {
 52     int i;
 53     int a, b, c, d;
 54     for (i=0; i<m; ++i)
 55     {
 56         scanf("%d %d %d %d", &a, &b, &c, &d);
 57         if (map[a][b] > c || (map[a][b] == c && cost[a][b] > d))    /*解决重边*/
 58         {
 59             map[a][b] = map[b][a] = c;
 60             cost[a][b] = cost[b][a] = d;
 61         }
 62     }
 63     scanf("%d %d", &s, &t);
 64     return;
 65 }
 66
 67 void Dijkstra()
 68 {
 69     int i, j, k;
 70     int mind, minc;
 71     dis[s] = cos[s] = 0;
 72     for (i=1; i<=n; ++i)
 73     {
 74         mind = minc = INF;
 75         for (j=1; j<=n; ++j)
 76         {
 77             /*多权值的比较*/
 78             if (flag[j] == 0 && (mind > dis[j] || (mind == dis[j] && minc > cos[j])))
 79             {
 80                 mind = dis[k = j];
 81                 minc = cos[k];
 82             }
 83         }
 84         flag[k] = 1;
 85         for (j=1; j<=n; ++j)
 86         {
 87             if (flag[j] == 0 && dis[j] > dis[k] + map[k][j])
 88             {
 89                 dis[j] = dis[k] + map[k][j];
 90                 cos[j] = cos[k] + cost[k][j];
 91             }
 92             /*当距离相同时考虑花费*/
 93             if (flag[j] == 0 && dis[j] == dis[k] + map[k][j] && cos[j] > cos[k] + cost[k][j])
 94             {
 95                 cos[j] = cos[k] + cost[k][j];
 96             }
 97         }
 98     }
 99     return;
100 }

转载于:https://www.cnblogs.com/JZQT/p/3802445.html

HDOJ-3790-最短路径问题 解题报告相关推荐

  1. HDOJ 2012 素数判定 解题报告

    今天确实坑爹,, 这么简单的题目都WA好多次,,, 都是细节上的错误, 直接导致崩盘,,额... 好吧,这个完全就是素数判断,没什么好说的 ,, 就是注意flag标记和判断是否符合条件,,其他就是输出 ...

  2. hdoj 1269-迷宫城堡解题报告

    链接http://acm.hdu.edu.cn/showproblem.php?pid=1269 求强连通分支的题,为了搞定2-sat问题,开始找这些题做,而且用的是gabow算法,是为了给自己打模板 ...

  3. HDOJ 2015 偶数求和 解题报告

    偶数求和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. 解题报告:线性规划与网络流24题

    目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...

  5. 《商务旅行》解题报告

    <商务旅行>解题报告 by mps [题目描述] 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其 ...

  6. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  7. 数据结构第七次上机实验-解题报告

    数据结构第七次上机实验-解题报告 7-1 序列调度 (100 分) 题目 思路 参考代码 7-2 最大最小差 (100 分) 题目 思路 参考代码 7-3 二叉树最短路径长度 (100 分) 题目 思 ...

  8. 2022.2.18解题报告

    2022.2.18解题报告 T1.切蛋糕 题目描述: 思路: 首先,我们先来看一下最少用几刀就可以解决所有情况. 对于一个蛋糕,要分成至少三块,那么最少都要2刀,因为0刀或1刀分出的蛋糕数量都小于3. ...

  9. 第十届“图灵杯”NEUQ-ACM程序设计竞赛个人赛解题报告

    第十届"图灵杯"NEUQ-ACM 题目链接 解题报告 D 文稿修订 思路 代码 F 吃包子 思路 代码 G 数字鉴定 思路 代码 H 线性变换 思路 代码 I 试题排版 思路 代码 ...

  10. CF144D Missile Silos 解题报告 *

    CF144D Missile Silos 解题报告 1 题目链接 https://codeforces.com/problemset/problem/144/D 2 题目整理 题目 : 导弹发射井 题 ...

最新文章

  1. Dubbo 入门介绍
  2. RuntimeError: Model class cmdb.models.UserInfo doesn't declare an explicit app_label
  3. QTablewidget只显示横分割线,不显示竖分割线
  4. mysqlbinlog工具_mysqlbinlog命令详解 Part 1-实验环境准备
  5. SpringBoot2.0 整合 Swagger2 ,构建接口管理界面
  6. mongodb 库数量限制_使用限制时,使用MongoDB获取文档总数
  7. 如何安装python3.7.2_CentOS7下安装Python3及Pip3并保留Python2
  8. mybatis-plus超详细讲解
  9. 实验五 编写、调试具有多个段的程序
  10. 阻止电脑自动安装软件_一套连招彻底阻止流氓软件静默安装
  11. SQLyog数据库导出
  12. vue设置必填项和判断必填项是否填入的弹窗提示
  13. 【历史上的今天】5 月 25 日:雅虎与 eBay 联盟;第一次国际万维网会议;Google 街景发布
  14. NLP-文本处理:词形归一(Lemma)【英文】【把各种类型的词的变形都归为一个形式】【went->go;are->be】
  15. gitea 手动编译过程,以及踩坑记录
  16. Python3.6+Twisted+Scrapy安装
  17. android 仿飞猪日历,vue 日期选择 类似飞猪
  18. AWS 亚马逊云良好架构框架
  19. MATLAB矩阵画法,MATLAB矩阵与数组
  20. 在OpenCV里实现内旋轮线

热门文章

  1. ES6专题——整理自阮一峰老师的ECMAScript 6入门
  2. BZOJ 2440 完全平方数(莫比乌斯-容斥原理)
  3. hbase里插入big int数据用Phoenix查看的报错问题
  4. 编译Ruby2.0 问题解决
  5. 微软私有云分享(R2)22 计算机配置文件与基础设置
  6. My97DatePicker在asp.net项目中的使用
  7. 通过日志恢复SQL Server的历史数据
  8. C++中的类加多线程代码修炼
  9. 老司机做VR视频,需要什么样的全景相机?
  10. linux设置套接字缓冲区的大小