這道題目的思路比較好
由於\(1\)到\(n\)的路徑很多,我們猜想,任意選一條路徑可以透過某種異或運算來得到最優解
證明:假設我們選出的路徑不是最優路徑,那麼對於另一條最優路徑,一定可以透過我們選出的路徑異或上若干個簡單環來達到。舉個例子說明
假設我們選出的是直線段\(AE\),最優的路線是\(A\)先走直線到\(D\),然後透過兩個圓弧\(DCB\)到達\(B\),最後再走直線到\(E\),那麼最優路線的值就等於我們選出的路徑異或上圖中的兩個簡單環
上述結論啟發我們,找到圖中所有的簡單環,然後用我們選出來的路徑加上若干個簡單環能夠到達的最大值就是答案
但是我們任選簡單環,是否一定能夠找到一條路徑對應呢?答案是肯定的,對於任意一個簡單環,我們先從\(1\)走到環上的某一點\(x\),然後走一遍這個環到\(x\),再從\(x\)又回到\(1\)號點就相當於得到了這個環的異或值
於是我們找出所有簡單環考慮線性基
當我們化出行簡化梯形矩陣的時候,記住每個非零行是若干個\(a\)的異或,也就是說我們任取非零行來異或一定可以在原來的\(a\)中找到一些\(a\)來異或起來對應;而這些非零行又是極大線性無關組,顯然可以覆蓋問題空間
注意行簡化梯形矩陣有“異或運算”這道題目所說的性質,所以我們依次從高位到低位貪心即可
找出所有簡單環的程式碼要記住