二进制在划分集合上的应用
二进制在划分集合上可以起到一定的作用
枚举每一位,将这一位编号为 0/1 的特殊节点分成两个集合,并建立一个超级源和超级汇,一个集合与超级源连边权为 0 的边,另一个集合与超级汇连边权为 0 的边,源和汇之间的最短路径就是当前划分方案的最短路径。由于每个点的编号一定不同,所以每两个节点至少会有一次被划分到不同集合
。
用 dijkstra 处理最短路的部分,时间复杂度 \(O(nlognlogm)\)。值得注意的是,由于这题是有向边,在枚举集合的时候要注意源点和汇点所连的集合,要两个集合都有一次与源点相连跑最短路的情况。
这个 trick 最早是在 2005年 周源的解题报告 中看到的,没想到又被翻出来当省选题目了。