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
在dijkstra函数中,你的优先队列条件判断错误了,应该是while(!q.empty())而不是while(q.empty() == true)。因为在程序中,priority_queue在空时返回false。
在主函数中,你初始化dis数组时,应该使用dis[s] = 0来设置源点s的初始距离,而不是dis[i] = 0x7fffffff,否则有概率会导致溢出问题。
在dijkstra函数中,你应该使用vis[e[i].to]来标记当前点是否被访问过,而不是vis[x]。并且,你应该在开始时初始化vis[s] = 1,因为源点已经访问过了。
在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了