鱼C论坛

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

狄克斯特拉算法问题

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

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

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

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

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

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

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

    for(int i = 1; i <= n; i++){
        int mindist = inf;
        int u = start;
        for(int j = 1; j <= n; j++){ // 找到与 开始节点 联通且边权最小的节点 u 
            if(!isused[j] && dist[j] < mindist){
                mindist = dist[j];
                u = j;
            }
        }
        isused[u] = 1; // u 用过了
        for(int j = 1; j <= n; j++){ // 找到与 u 相邻且权值最小的节点
            if(!isused[j] && mp[u][j] != 0){ 
                int newdist = mp[u][j] + dist[u]; // 更新 dist
                if(newdist < dist[j]){
                    dist[j] = newdist;
                    pre[j] = u;
                }
            }
        }
    }
}

int main(){
    ios::sync_with_stdio(0);
    memset(mp, 0, sizeof(mp));
    cin >> n >> m >> s;

    for(int i = 0; i < m; i++){
        int u, v, w;
        cin >> u >> v >> w;
        mp[u][v] = w;
    }

    Dijkstra(s);

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

    return 0;
}
测试用例 2 :
5 15 5
2 5 181
1 5 98
4 2 49
3 2 262
4 3 26
2 4 192
5 1 221
2 2 254
4 4 233
1 5 44
5 4 67
4 2 214
1 1 47
1 1 118
5 4 3
正确输出 :
221 52 29 3 0 
但是我这个不能 , 不知道哪里有问题 , 求指出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-7-4 22:56:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-5 10:09:49 | 显示全部楼层
请问你的测试用例 2 数据正确吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


洛谷上的随机数据 , 不知道欸
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

难道我代码没问题?
题目里的样例是过了的
想知道小甲鱼最近在做啥?请访问 -> 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 但长度不同?
想知道小甲鱼最近在做啥?请访问 -> 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
明显路径相同,但长度不一样(这和测试用例数据有关,因为重复路径)
想知道小甲鱼最近在做啥?请访问 -> 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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

?????
这玩意还可以不止一条边?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不知道,因为测试用例是你发的,所以我才问,数据是否正确?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

可能是故意的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-29 09:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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