关于dijkstra
  • 板块学术版
  • 楼主翼德天尊
  • 当前回复12
  • 已保存回复12
  • 发布时间2020/8/30 20:12
  • 上次更新2023/11/5 13:56:17
查看原帖
关于dijkstra
257621
翼德天尊楼主2020/8/30 20:12

RT,有一个问题我一直想不明白。

今天我在做 P5905 【模板】Johnson 全源最短路 的时候,刚开始是这么写的:

void dijkstra(int s){
	memset(vis,0,sizeof(vis));
	for (int i=1;i<=n;i++) dis[i]=INF;
	priority_queue<node1> q;
	q.push(node1(0,s));
	dis[s]=0;
	while (!q.empty()){
		int u=q.top().to;
		q.pop();
		vis[u]=1;
		for (int i=head[u];i;i=e[i].next){
			int v=e[i].to,w=e[i].w;
			if (dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				if (!vis[v]){
					q.push(node1(dis[v],v));
				}
			} 
		}
	}
}

有两个点 TLE。而在不断对照题解后,终于找出了错误。后加上了一句:

if(vis[u]) continue;

将其改为:

void dijkstra(int s){
	memset(vis,0,sizeof(vis));
	for (int i=1;i<=n;i++) dis[i]=INF;
	priority_queue<node1> q;
	q.push(node1(0,s));
	dis[s]=0;
	while (!q.empty()){
		int u=q.top().to;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for (int i=head[u];i;i=e[i].next){
			int v=e[i].to,w=e[i].w;
			if (dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				if (!vis[v]){
					q.push(node1(dis[v],v));
				}
			} 
		}
	}
}

就全部 AC,而且快了很多。但是在每次进行 dijkstra\text{dijkstra} 的之前,不都已经将 visvis 数组全部赋值为 00,并且在每次加进队列的时候,都已经将元素进行过判断了吗?为什么会差这么多速度?请各位大佬帮忙解答,谢谢!

2020/8/30 20:12
加载中...