多源最短路的学习&应用

还是接触了好几道多源最短路了。结果每次都发现自己并没有真正理解,做一道错一道(不过乐观一点想,也是做一道错一道学一道啦qwq)

初次相遇:HDU6166
官解:按照点的标号的每个二进制位分组,最多分20次(准确的说是17次)。每次会把某一位不同的点分开到起点和终点集,然后再起点终点互换,再做一次。

正确性在于:对于任意两个点u和v,u和v是不同的点,必然有至少一个位不同,因此至少有一次他们被分到了各自正确的集合中,得到了正确答案,其他的答案都比他要大。

但是当时HDU系统维护中,就没有写代码了

再次相逢:20191029考试
考试题T3
向特殊点连0边,跑最短路
枚举每一条边,如果这条边是由不同的特殊点更新得到的,就可以更新这两个特殊点的距离

但问题是这只能针对于双向图的情况
如果是单向图的话,冥冥之中总会遇见

兜兜转转:20191108考试
考试题T3
由于大多省选同学做过了,就换了一道题。考试结束后重新来做(这就是HDU6166啊!!!),我想到了20191029的做法。
可惜的是这次是单向图,如果简单地套用20191029的做法,显然会错
那么我们就需要反向建边再跑一边最短路,然后就很容易啦

当然,如果我还记得HDU6166的话,就不会有那么多幺蛾子了
毕竟二进制这种做法,无论是有向图还是无向图都不影响
(因为这个玩意儿就是相当于暴力嘛,枚举起点集合和终点集合)

你可能感兴趣的:(dijkstra)