沒錯,線性基。
不會的同學請先學習:線性基。
但是這道題,因為是在圖里,所以不能直接簡單地用線性基求解。
觀察題目中的圖,我們可以發現(嗎?),答案一定是由從 $1$ 到 $n$ 的一條路徑上的異或和以及若干環上的異或和構成的。
首先我們要理清乙個問題:從 $1$ 到 $n$ 的路徑不用特意去選,它對答案沒有任何影響。
借用大佬的部落格 來解釋:稱從 $1$ 到 $n$ 的路徑為「主要路」。
可以發現,所有的「主要路」兩兩之間會構成乙個環。
如果一條「主要路」 $a$ 優於 $b$,而我們選擇了 $b$。
但 $a$ 和 $b$ 也會構成一條環加入線性基,如果更優,肯定會在求解環節被異或上。
這樣一來,就相當於沿 $a$ 跑了一遍。
回到原來的問題,那麼我們要選擇哪些環使得異或和最大呢?
這個時候,我們就會發現,又繞回了最基本的最大異或和問題。
那麼我們就可以把路徑上的每個環上的異或和放入線性基,最後用我們「主要路」的路徑和為基數,去求解最大異或和。
就是這樣啦(*^▽^*)
那麼,上**!
#include #includeview code#include
using
namespace
std;
const
int maxn = 50005
;const
int maxm = 100005
;typedef unsigned
long
long
ull;
struct
edge
edge(
int to,int
next,ull dis):to(to),next(next),dis(dis){}
}edge[maxm
<< 1
];int
head[maxn],cnt;
void add(int u,int
v,ull t)
ull d[
70];
void
insert(ull x) }}
return;}
intn,m;
ull sum[maxn];
bool
vis[maxn];
void dfs(int
x,ull ans)
else
}return
;
}ull query(ull x)
returnx;}
intmain()
dfs(
1 , 0
); printf(
"%llu
",query(sum[n]));
return0;
}
完結撒花✿✿ヽ(°▽°)ノ✿
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 不與簡單路徑相連 我們需要跑過...
題解 WC2011 最大XOR和路徑
luogu 給定 n 個點 m 條邊的帶權無向圖 問所有 1 到 n 的路徑中 邊權異或和最大是多少 其中 n le 50000,m le 100000 且可能有重邊和自環 首先 看到最大異或和 我們很自然的想到用線性基去處理 但線性基對最大異或和的限制十分嚴格 需要數字之間能任意異或 而本題需要選...