luogu P6628 [省选联考 2020 B 卷] 丁香之路
首先给定你要走的边一定要走,因此我们的目标是最小化走多余的边权。
容易发现如果和 \(y\) 相连有两条边,分别为 \(x\to y,y\to z\),且分别要求走一次,那么这相当于要求从 \(x\to z\)。更一般的,这就是欧拉路问题。
方便起见,将起终点的连边也设定为必须走,这样我们要解决的就是欧拉回路问题。欧拉回路有两个条件:度数和联通。首先考虑度数,我们会发现我们得到了一车度数为奇数的点,这些点需要两两匹配来让度数为偶数,因为边权相当于在数轴上的距离,因此把两个在数轴上最近的点匹配一定不会更劣。
然后解决联通的问题。假设我们得到了一个不连通的解,这个解中有一堆小环,并且这些小环是最优的。那么只需要将小环看成一个点,然后跑最小生成树即可,多出来的边权是最小生成树边权的两倍。
有一个细节卡了挺久,就是解决度数的时候因为 \(i\to j\) 的边肯定不如 \(i\to i+1\to\dots\to j\) 的一车长度为 \(1\) 的边,因此这样子可以更好地让图联通。
时间复杂度 \(O(n^2\log n)\)。

浙公网安备 33010602011771号