样例没过求条

P4779 【模板】单源最短路径(标准版)

Cute_Furina @ 2024-09-17 13:25:17

#include<bits/stdc++.h>
using namespace std;
struct edge {
    int to, dis, next;
}e[100010];
struct node {
    int dis, pos;
    bool operator <(const node &x)const {
        return x.dis < dis;
    }
};
priority_queue<node> q;
int head[100010], dis[100010], vis[100010];
int cnt, n, m, s;
void dijkstra() {
    dis[s] = 0;
    q.push((node){0, s});
    while(q.empty() == true) {
        node tmp = q.top();
        q.pop();
        int x = tmp.pos, d = tmp.dis;
        if(vis[x]) continue;
        vis[x] = 1;
        for(int i = head[x]; i != 0; i = e[i].next) {
            if(dis[e[i].to] > dis[x] + e[i].dis) {
                dis[e[i].to] = dis[x] + e[i].dis;
                if(vis[e[i].to] == 0) {
                    q.push((node){dis[e[i].to], e[i].to});
                }
            }
        }
    }
}
int main() {
    cin >> n >> m >> s;
    for(int i = 1;i <= n;i ++) {
        dis[i] = 0x7fffffff;
    }
    for(int i = 1;i <= m;i ++) {
        int u, v, d;
        cin >> u >> v >> d;
        cnt ++;
        e[cnt].dis = d;
        e[cnt].to = v;
        e[cnt].next = head[u];
        head[u] = cnt;
    }
    dijkstra();
    for(int i = 1;i <= n;i ++) {
        cout << dis[i] << " ";
    }
    return 0;
}

by M1saka16I72 @ 2024-09-17 13:31:35

q.empty() == true


by M1saka16I72 @ 2024-09-17 13:32:20

并且你优先队列的比较函数是反的


by difficultlong @ 2024-09-17 13:34:31

@Luowj

1. 优先队列的条件判断错误

在dijkstra函数中,你的优先队列条件判断错误了,应该是while(!q.empty())而不是while(q.empty() == true)。因为在程序中,priority_queue在空时返回false。

2. 优先队列的初始化

在主函数中,你初始化dis数组时,应该使用dis[s] = 0来设置源点s的初始距离,而不是dis[i] = 0x7fffffff,否则有概率会导致溢出问题。

3. 访问标记数组初始化错误

在dijkstra函数中,你应该使用vis[e[i].to]来标记当前点是否被访问过,而不是vis[x]。并且,你应该在开始时初始化vis[s] = 1,因为源点已经访问过了

4. 路径更新时的条件判断

在dijkstra函数中,你应该更新dis[e[i].to],如果dis[e[i].to]大于dis[x] + e[i].dis,而不是dis[e[i].to] > dis[x] + e[i].dis。注意:这里应该是赋值操作而不是比较操作。


by zhangbo1000 @ 2024-09-17 13:35:28

@Luowj 优先队列(堆)用小于的话实际是从大到小排序啊。


by difficultlong @ 2024-09-17 13:36:39

@Luowj 楼主,这是我爆肝了30分钟的回答,如果对你有帮助,可以参加我们的团队吗?

我诚心的邀请您加入我们的团队 https://www.luogu.com.cn/team/88893


by Cute_Furina @ 2024-09-17 13:38:34

@difficultlong 加入不了

提交失败 team.exceeds_joined_team_limit


by Cute_Furina @ 2024-09-17 13:39:01

@M1saka16I72 thx


by JOKER_chu @ 2024-09-17 13:40:42

@difficultlong GPT 吧,题目都没看清,dis[i] 肯定是极大值啊。


by JOKER_chu @ 2024-09-17 13:43:11

@difficultlong @Luowj 你这就只有第一条是对的啊,这不是误人子弟吗


by Cute_Furina @ 2024-09-17 13:45:42

@M1saka16I72 改了,只有一个点AC,其他的RE了


| 下一页