顺便再问一个问题,这是部分AC代码
while(!r.empty()){
int u=r.front();r.pop();
vis[u]=0;
for(auto vv:e[u]){
int v=vv.first,w=vv.second;
bool f=0;
if(dis[u][0]+w<dis[v][0]){
f=1;
dis[v][1]=dis[v][0];
dis[v][0]=dis[u][0]+w;
if(dis[u][1]+w<dis[v][1]) f=1,dis[v][1]=dis[u][1]+w;
}
else if(dis[u][0]+w<dis[v][1] && dis[u][0]+w>dis[v][0]) f=1,dis[v][1]=dis[u][0]+w;
if(f && !vis[v]) vis[v]=1,r.push(v);
}
}
改成下面这个连样例都过不了
while(!r.empty()){
int u=r.front();r.pop();
vis[u]=0;
for(auto vv:e[u]){
int v=vv.first,w=vv.second;
if(dis[u][0]+w<dis[v][0]){
dis[v][1]=dis[v][0];
dis[v][0]=dis[u][0]+w;if(!vis[v]) vis[v]=1,r.push(v);
if(dis[u][1]+w<dis[v][1]){
dis[v][1]=dis[u][1]+w;
}
}
if(dis[u][0]+w<dis[v][1] && dis[u][0]+w>dis[v][0]){
dis[v][1]=dis[u][0]+w;
if(!vis[v]) vis[v]=1,r.push(v);
}
}
}