CF 933 G(建立虚点,01BFS)
933 G
需要特别注意题目:每种颜色的边一定在同一个联通块中。
做法1:建立虚点
对于同一种颜色的边构成的联通块,两点之间相互到达的代价均为1。那么可以省去原图中所有这种颜色的边,对这种颜色建一个虚拟点,并对该联通块中的每个点 \(u\) 与该虚拟点连一条双向边,其中 \(u\) 到虚拟点的边权为1,虚拟点到 \(u\) 的边权为0。对每种颜色都这样建图,可以证明这个图和原图是等价的。那么要计算从 \(b\) 到 \(e\) 的最短路,就转化为了 \(01bfs\) 问题(即边权只有0和1),可以用双端队列来实现。
做法2:将边看作点,点看作边。
由于到达某种颜色的任意一条边的最短路是相同的,因此可以考虑对每种颜色的边求最短路。可以将边看作点,再进行 \(dijkstra\) 转移。但需要注意,标记数组的对象只能是原图中的点,否则若标记改为每种颜色的边,复杂度不能保证正确,而标记每个点是否转移过,复杂度仍是 \(O(n + E)\) 的。具体细节见代码。