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 的之前,不都已经将 vis 数组全部赋值为 0,并且在每次加进队列的时候,都已经将元素进行过判断了吗?为什么会差这么多速度?请各位大佬帮忙解答,谢谢!