1. 程式人生 > 其它 >CF845G Shortest Path Problem? 題解

CF845G Shortest Path Problem? 題解

首先看到題目的時候,看見異或最小值,就需要想到可能是線性基,而這題正需要線性基。

對於 \(1 \to n\) 的路徑而言,我們可以將這條路徑拆成 2 部分:一條鏈 + 一些環。

相當於我們要求鏈的路徑長度異或上所有環長度的最小值。

先看所有環長度的異或最小值,我們可以先用一遍 DFS 預處理出所有的環,將這些環的長度丟到線性基裡面,那麼這樣線性基能異或出來的最小值就是所有環長度的最小值。

但是還有一條鏈啊?

實際上這條鏈可以隨便選!

證明如下:

假設我們不能隨便選鏈,也就是說我們必須選擇長度為 \(A\) 的鏈才能得到正確答案。

設所有環能異或出的最小值為 \(x\),我們選出的路徑長度為 \(B\)

,實際上的最優長度為 \(A\),那麼按照假設我們有 \(B \oplus x > A \oplus x\)

但是注意到這是一張無向圖,因此路徑 \(A\) 和路徑 \(B\) 共同組成了一個環。

由於我們需要求的是最小值,因此當我們遍歷線性基求最小值的時候由於 \(A \oplus x\) 更優,將會導致 \(B \gets B \oplus A\)

因此實際上 \(A,B\) 兩條路徑是同等優秀的,不存在哪條更加優秀的鏈。

證畢。

Code:GitHub CodeBase-of-Plozia CF845G Shortest Path Problem.cpp