单源最短路次短路计数

可以使用dp的思想,在dijkstra的同时更新计数。首先我们只考虑最短路计数。在dijkstra的同时开一个数组ans,ans[i]表示从1~i的最短路数量。毫无疑问我们可以用有后效性dp的思想去更新(迭代)。每次跑dijkstra,取出点x,访问他的出边,指向的点我们记为y,先判断能不能更新,如果能更新,那么ans[y] = ans[x](目前只有可能是从这个x点走到y,才满足最短路)。否则,如果dis[y]与dis[x] + 边权 相等,则从x来也可以得到目前到此点最短路,累加(ans[y]+= ans[x])。

那么我们就解决了最短路计数。

如何解决接下来的次短路计数呢?我们先想一个问题,次短路的长度怎么求?

我们把dis数组开至二维,第一维表示最短,第二维表示次短。初始化时只对最短路进行初始化,因为是先有最短再有次短,目前不能确定有没有次短。即,次短路的值我们要用最短路去迭代。想这样一个问题,如果我们可以更新最短路,那么次短路的值就被赋为了更新前的最短路。如果最短路是更新不了的,但是我们发现次短路是可以更新的,那就只需更新次短路。与单源最短路相同,更新后必须要入堆,这个堆的唯一关键字就是dis。与此同时,v数组也要开二维,因为最短路与次短路,都有着更新别人的权利。

那次短路计数就迎刃而解了,也是随着更新dis顺手就把ans做出来了。

时间复杂度嘛。。。这个题(poj3463)图比较稀疏,所以用dijkstra比较快。

那如何用spfa进行处理呢?听说不好处理...会有重,但是我还是没太想明白这个问题。留着坑吧。

你可能感兴趣的:(图论)