如果你使用 Dijkstra 得到 90 pts,且 WA#3、#11:
可以重复走点,请删除你的 vst 数组(或者其它标记点是否走过的数组)。
另外还要注意最大值和次大值不能相等,否则你会因为神秘原因而 TLE+MLE。
顺便附上我的处理次大值的方法,感觉还是蛮实用的:
pair<LL,bool> dises[4]={
{dis1[x]+z,true},
{dis2[x]+z,true},
{dis1[y],false},
{dis2[y],false},
};
sort(dises,dises+4);
dis1[y]=dises[0].first;
int p=1;
while(p<4 && dises[p].first==dises[0].first) p++;
dis2[y]=dises[p].first;
if(dises[0].second||dises[p].second)
pq.push({dis1[y],y});
原理是直接把四个值拿出来排序,避免了分类讨论的麻烦。
顺便标记是否是从 x 转移过来的(排序时自动优先不从 x 转移)
然后 while 找第一个与最大值不相等的次大值。
特点是无脑,挺实用的,而且还可以扩展。