加载中...

CF 933 G(建立虚点,01BFS)

933 G

需要特别注意题目:每种颜色的边一定在同一个联通块中。

做法1:建立虚点

对于同一种颜色的边构成的联通块,两点之间相互到达的代价均为1。那么可以省去原图中所有这种颜色的边,对这种颜色建一个虚拟点,并对该联通块中的每个点 \(u\) 与该虚拟点连一条双向边,其中 \(u\) 到虚拟点的边权为1,虚拟点到 \(u\) 的边权为0。对每种颜色都这样建图,可以证明这个图和原图是等价的。那么要计算从 \(b\)\(e\) 的最短路,就转化为了 \(01bfs\) 问题(即边权只有0和1),可以用双端队列来实现。

code1

做法2:将边看作点,点看作边。

由于到达某种颜色的任意一条边的最短路是相同的,因此可以考虑对每种颜色的边求最短路。可以将边看作点,再进行 \(dijkstra\) 转移。但需要注意,标记数组的对象只能是原图中的点,否则若标记改为每种颜色的边,复杂度不能保证正确,而标记每个点是否转移过,复杂度仍是 \(O(n + E)\) 的。具体细节见代码。

code2

posted @ 2025-03-18 21:44  jxs123  阅读(29)  评论(0)    收藏  举报