luogu
給定 \(n\) 個點 , \(m\) 條邊的帶權無向圖 , 問所有 \(1\) 到 \(n\) 的路徑中 , 邊權異或和最大是多少
其中 \(n \le 50000, m \le 100000\) , 且可能有重邊和自環
首先 , 看到最大異或和 , 我們很自然的想到用線性基去處理
但線性基對最大異或和的限制十分嚴格 , 需要數字之間能任意異或 , 而本題需要選取的邊是一條 \(1\) 到 \(n\) 的路徑
仔細觀察會發現 , 所有簡單路徑都可以等價表示為任意一條 \(1\) 到 \(n\) 的簡單路徑加上乙個過 \(n\) 點的環
如路徑 \(1 -> 3 -> 4\) 可以表示為 \(1 -> 2 -> 4 -> 2 -> 1 -> 3 -> 4\)
其中 \(4 -> 2 -> 1 -> 3 -> 4\) 就是乙個過點 \(4\) 的環
那我們再考慮不是簡單路徑的路徑
路徑 \(1 -> 3 -> 4 -> 5 -> 6 -> 4 -> 3 -> 7\) 中 \(3 -> 4\) 這條邊經過了兩次 , 由異或運算的性質可知這條邊不計入貢獻 , 所以這條路徑可以表示為簡單路徑 \(1 -> 3 -> 7\) 再加上不過點 \(7\) 的環 \(4 -> 5 -> 6 -> 4\)
那如果我們選的簡單路徑是 \(1 -> 2 -> 7\) 那剛剛那條路徑可以表示為簡單路徑 \(1 -> 2 -> 7\) 加上環 \(7 -> 2 -> 1 -> 3 -> 7\) 再加上環 \(4 -> 5 -> 6 -> 4\)
也就是一條好長好長的路徑 \(1 -> 2 -> 7 -> 2 -> 1 -> 3 -> 7 -> 3 -> 4 -> 5 -> 6 -> 4 -> 3 -> 7\)
其中 \(1 -> 2, 2 -> 7, 3 -> 4\) 經過了兩次 , \(3 -> 7\) 被經過了三次
所以我們猜測所有 \(1\) 到 \(n\) 的路徑都可以表示為任意一條 \(1\) 到 \(n\) 的簡單路徑加上任意個環
而當圖聯通的情況下 , 任意一條 \(1\) 到 \(n\) 的簡單路徑加上任意個環也顯然可以表示一條 \(1\) 到 \(n\) 的路徑
這樣我們終於把題目轉化成了線性基能做的形式
只要我們把所有環插入線性基內 , 再以任意一條簡單路徑為初始值跑一遍線性基 , 最大異或和就是答案啦
但是我們發現 , 當可能出現重邊時 , 圖中的環的個數是指數級別的
仔細觀察發現 , 有些環可以等價的用其他環表示
如環 \(1 -> 2 -> 4 -> 3 -> 1\) 可以表示為環 \(1 -> 2 -> 3 -> 1\) 加上環 \(3 -> 2 -> 4 -> 3\)
即路徑 \(1 -> 2 -> 3 -> 1 -> 3 -> 2 -> 4 -> 3 -> 1\) , 其中 \(2 -> 3\) 經過兩次 , \(1 -> 3\) 經過三次
也就是說 , 乙個無向連通圖存在乙個由若干個環構成的基 , 且這張圖中所有的環都可以由基中的環異或得到
那這個基又是什麼呢 ?
個人感覺這裡是這道題最神奇的地方 , 我實在是編不出這個解法的腦迴路 , 於是只能直接講結論了
建出無向圖的 dfs 樹 , 基就是那些由一條非樹邊和若干條樹邊構成的環的集合
顯然 , 一條非樹邊和若干條樹邊只能構成乙個環
我們假設由非樹邊 \(e\) 和若干條樹邊構成的環的異或和為 \(v_e\)
首先 , 對於僅由樹邊構成的環 , 這樣的環不存在
然後 , 對於一條非樹邊和若干條樹邊構成的環 , 它就在基裡面
最後 , 對於由若干條非樹邊 \(e_1, e_2, ... e_k\) 和若干條樹邊構成的環 , 他的異或和就是 \(v_ \oplus v_ \oplus .... \oplus v_\)
因為兩個環異或就相當於他們的邊集的並再去掉邊集的交
非樹邊共 \(m - n + 1\) 條 , 所以基中的環有 \(m - n + 1\) 個 , 將他們插進線性基中 , 複雜度為 \(o((m - n) \log v)\) 其中 \(v\) 為邊權大小
至此本題解決
#include using namespace std;
typedef long long ll;
const int n = 50010;
const int m = 200010;
ll n, m, cnt, k, head[n], to[m], nxt[m], w[m], st[n], d[n], vis[n]; // st為線性基 , d為dfs樹上點的深度(d[n]當然就是一條簡單路徑的長度)
inline void addedge(int u, int v, ll k)
void add(ll x)
x ^= st[i];
}}ll que(ll x)
void dfs(int x, ll dist)
}int main()
dfs(1, 0);
printf("%lld\n", que(d[n]));
return 0;
}
WC2011 最大XOR和路徑 題解
首先看到題面,最大 異或 聯想到了什麼?沒錯,線性基。不會的同學請先學習 線性基。但是這道題,因為是在圖里,所以不能直接簡單地用線性基求解。觀察題目中的圖,我們可以發現 嗎?答案一定是由從 1 到 n 的一條路徑上的異或和以及若干環上的異或和構成的。首先我們要理清乙個問題 從 1 到 n 的路徑不用...
WC2011 最大XOR和路徑
wc2011 最大xor和路徑 本題關鍵是抓住xor的性質 a b a b 異或兩次等於0 1到n,一定是走一條路,可能再往別處走出環 每個環都可以 獨立 走出來 1到n的路徑,可以拆成任意一條路和若干個環拼成的 dfs找環,加入線性基 能變大就異或上去。o m 64 include define ...
WC 2011 最大Xor和路徑
給你一張n個點,m條邊的無向圖,每條邊都有乙個權值,求 1到n的路徑權值和的最大值。任意一條路徑都能夠由一條簡單路徑 任意一條 在接上若干個環構成 如果不與這條簡單路徑相連就走過去再走回來 那麼在對這些環進行分類 1 直接與簡單路徑相連 相交的重複部分不算就可以了。2 不與簡單路徑相連 我們需要跑過...