鱼C论坛

 找回密码
 立即注册
查看: 2170|回复: 11

狄克斯特拉算法问题

[复制链接]
发表于 2022-7-4 22:55:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 柿子饼同学 于 2022-7-4 23:03 编辑

题目在下, 代码 :
https://www.luogu.com.cn/problem/P3371
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define inf 999999999

  4. int n, m, s;
  5. int mp[1002][1002]; // mp[x][y] : x -> y 邻接矩阵存有向图 , [x][y] 代表 x - > y
  6. int start;
  7. int dist[1002]; // start -> dist[v] 最短路径 start 到 dist v 的最短路
  8. int pre[1002]; // prenode[v] -> v 就是v的前驱节点
  9. bool isused[1002];

  10. void Dijkstra(int start){
  11.     fill(dist, dist+1002, inf); // 初始化
  12.     for(int i = 1; i < n; i++){
  13.         if(mp[start][i]) dist[i] = mp[start][i]; // 与开始节点的连线 , 不然就是 inf
  14.     }
  15.     dist[start] = 0;
  16.     isused[start] = 1;
  17.     pre[start] = 0; // INIT 初始化

  18.     for(int i = 1; i <= n; i++){
  19.         int mindist = inf;
  20.         int u = start;
  21.         for(int j = 1; j <= n; j++){ // 找到与 开始节点 联通且边权最小的节点 u
  22.             if(!isused[j] && dist[j] < mindist){
  23.                 mindist = dist[j];
  24.                 u = j;
  25.             }
  26.         }
  27.         isused[u] = 1; // u 用过了
  28.         for(int j = 1; j <= n; j++){ // 找到与 u 相邻且权值最小的节点
  29.             if(!isused[j] && mp[u][j] != 0){
  30.                 int newdist = mp[u][j] + dist[u]; // 更新 dist
  31.                 if(newdist < dist[j]){
  32.                     dist[j] = newdist;
  33.                     pre[j] = u;
  34.                 }
  35.             }
  36.         }
  37.     }
  38. }

  39. int main(){
  40.     ios::sync_with_stdio(0);
  41.     memset(mp, 0, sizeof(mp));
  42.     cin >> n >> m >> s;

  43.     for(int i = 0; i < m; i++){
  44.         int u, v, w;
  45.         cin >> u >> v >> w;
  46.         mp[u][v] = w;
  47.     }

  48.     Dijkstra(s);

  49.     for(int i = 1; i <= n; i++){
  50.         cout << dist[i] << ' ';
  51.     }

  52.     return 0;
  53. }
复制代码

测试用例 2 :
  1. 5 15 5
  2. 2 5 181
  3. 1 5 98
  4. 4 2 49
  5. 3 2 262
  6. 4 3 26
  7. 2 4 192
  8. 5 1 221
  9. 2 2 254
  10. 4 4 233
  11. 1 5 44
  12. 5 4 67
  13. 4 2 214
  14. 1 1 47
  15. 1 1 118
  16. 5 4 3
复制代码

正确输出 :
  1. 221 52 29 3 0
复制代码

但是我这个不能 , 不知道哪里有问题 , 求指出
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-7-4 22:56:19 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-7-5 10:09:49 | 显示全部楼层
请问你的测试用例 2 数据正确吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-5 10:30:31 | 显示全部楼层
傻眼貓咪 发表于 2022-7-5 10:09
请问你的测试用例 2 数据正确吗?


洛谷上的随机数据 , 不知道欸
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-5 10:41:19 | 显示全部楼层
傻眼貓咪 发表于 2022-7-5 10:09
请问你的测试用例 2 数据正确吗?

难道我代码没问题?
题目里的样例是过了的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-5 10:55:30 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-7-5 10:56 编辑
柿子饼同学 发表于 2022-7-5 10:41
难道我代码没问题?
题目里的样例是过了的


测试用例 2
第 14 行:1 1 47
第 15 行:1 1 118
u -> v 如果 u = v 那么长度不是应该是 0 吗?

第 4 行:4 2 49
第 13 行:4 2 214
为什么可以重复 u -> v 但长度不同?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-5 11:02:12 | 显示全部楼层
柿子饼同学 发表于 2022-7-5 10:41
难道我代码没问题?
题目里的样例是过了的


正确答案:221 52 29 3 0
你的代码:221 217 29 3 0
如果不用代码计算,画在纸上计算,可以得知答案确实是 52
正确答案:5 -> 4 -> 2 = 3 + 49 = 52(最小)
你的代码:5 -> 4 -> 2 = 3 + 214 = 217
明显路径相同,但长度不一样(这和测试用例数据有关,因为重复路径)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-5 11:06:50 | 显示全部楼层
柿子饼同学 发表于 2022-7-5 10:41
难道我代码没问题?
题目里的样例是过了的

你的代码已经很完善了,只是没有考虑到重复路线选择其中最优路径问题,比如:
4 -> 2 有两条:
(一)4 2 49
(二)4 2 214

明显该选择路线一吧,但你的代码好象是以 FILO(先进后出)方式进行,所以选择了路线二。

评分

参与人数 1荣誉 +5 收起 理由
柿子饼同学 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-5 12:12:03 From FishC Mobile | 显示全部楼层
傻眼貓咪 发表于 2022-7-5 11:06
你的代码已经很完善了,只是没有考虑到重复路线选择其中最优路径问题,比如:
4 -> 2 有两条:
(一)4 ...

?????
这玩意还可以不止一条边?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-5 13:10:37 | 显示全部楼层
柿子饼同学 发表于 2022-7-5 12:12
?????
这玩意还可以不止一条边?

不知道,因为测试用例是你发的,所以我才问,数据是否正确?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-5 17:31:00 | 显示全部楼层
傻眼貓咪 发表于 2022-7-5 13:10
不知道,因为测试用例是你发的,所以我才问,数据是否正确?

可能是故意的吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-5 17:49:28 | 显示全部楼层

哈哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-17 13:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表