问一个关于Dijkstra堆优化的问题
  • 板块学术版
  • 楼主54Teddy
  • 当前回复22
  • 已保存回复22
  • 发布时间2020/10/9 21:31
  • 上次更新2023/11/5 11:24:32
查看原帖
问一个关于Dijkstra堆优化的问题
103120
54Teddy楼主2020/10/9 21:31

P4779中第一篇题解

Dijkstra优化的代码部分是这样的(本人写的)

struct node {
	int u, dis;
	bool operator < (const node &p) const {
		return dis > p.dis;
	}
};
priority_queue <node> q;
int dis[maxn];
int vis[maxn];
void dijkstra (int s) {
	memset (dis, 0x3f3f3f3f, sizeof dis);
	q.push((node){s, 0});
	dis[s] = 0;
	while (!q.empty()) {
		node t = q.top();
		q.pop();
        if (vis[t.u]) continue;
        vis[t.u] = 1;
		for (int i = p[t.u]; ~i; i = e[i].next) {
			int to = e[i].to;
			if (dis[to] > dis[t.u] + e[i].w) {
				dis[to] = dis[t.u] + e[i].w;
				q.push((node){to, dis[to]});
			}
		}
	}
	return ;
}

(大概没写错吧)

但是中间有两行:

if (vis[t.u]) continue;
vis[t.u] = 1;

有的时候不加这两行才对,加了就是错的(虽然不加跑得很慢)

请问一下是什么原因呢?是因为负权边吗?

2020/10/9 21:31
加载中...