WC2011 最大XOR和路徑 題解

2022-07-06 17:15:13 字數 1530 閱讀 8088

首先看到題面,「最大」「異或」,聯想到了什麼?

沒錯,線性基。

不會的同學請先學習:線性基。

但是這道題,因為是在圖里,所以不能直接簡單地用線性基求解。

觀察題目中的圖,我們可以發現(嗎?),答案一定是由從 $1$ 到 $n$ 的一條路徑上的異或和以及若干環上的異或和構成的。

首先我們要理清乙個問題:從 $1$ 到 $n$ 的路徑不用特意去選,它對答案沒有任何影響。

借用大佬的部落格 來解釋:稱從 $1$ 到 $n$ 的路徑為「主要路」。

可以發現,所有的「主要路」兩兩之間會構成乙個環。

如果一條「主要路」 $a$ 優於 $b$,而我們選擇了 $b$。

但 $a$ 和 $b$ 也會構成一條環加入線性基,如果更優,肯定會在求解環節被異或上。

這樣一來,就相當於沿 $a$ 跑了一遍。

回到原來的問題,那麼我們要選擇哪些環使得異或和最大呢?

這個時候,我們就會發現,又繞回了最基本的最大異或和問題。

那麼我們就可以把路徑上的每個環上的異或和放入線性基,最後用我們「主要路」的路徑和為基數,去求解最大異或和。

就是這樣啦(*^▽^*)

那麼,上**!

#include #include 

#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;

}

view code

完結撒花✿✿ヽ(°▽°)ノ✿

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 且可能有重邊和自環 首先 看到最大異或和 我們很自然的想到用線性基去處理 但線性基對最大異或和的限制十分嚴格 需要數字之間能任意異或 而本題需要選...