WC2011 最大XOR和路徑 解題報告

2022-04-29 04:45:09 字數 1059 閱讀 6335

給出乙個無向圖,求出從 \(1\) 到 \(n\) 的路徑的邊權異或值最大值,重複經過重複異或。

去學了一下線性基,發現還挺好用的。

如果不會,請左轉線性基學習筆記。

可以發現,如果兩次經過一條邊,那麼那條邊對答案沒有影響。

那麼如果在目前的路徑上從一點跑到另外一點,然後從這個點跑乙個環,再原路返回,只會將答案異或上那個環的異或值。

如果將環的異或值都單獨拉出來,然後再隨便找一條從 \(1\) 到 \(n\) 的路徑,變成這條路徑的異或值再異或上部分環的異或值使其最大,就轉化為了線性基模型了。

當然不用找出所有的環,那樣複雜度太劣了,只用找出一部分環,使其他的環的異或值都可以通過那些環的異或值異或出來,這個跑一遍 \(dfs\) 就行了。

可以分兩種情況:

環內無環,此時這個環必然被dfs找到。

環內套環(稱這種環為復合環),此時這個環可以被分成乙個復合環和乙個非復合環(或兩個非復合環,即分到底),而這兩個環我們已經考慮了(任意復合環有限次分割後必然得到若干非復合環,非復合環(即情況1)已經被考慮。)

#includeusing namespace std;

#define int long long

const int m=1e5+5;

int n,m;

int read()

int tot=0,first[m];

struct edgee[m<<1];

void add(int x,int y,int z);

first[x]=tot;

}int p[m];

void insert(int x)

}int query(int x)

return x;

}int dis[m];bool vis[m];

void dfs(int u,int fa)

}void solve()

dfs(1,0);

printf("%lld\n",query(dis[n]));

}signed main()

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和路徑 題解

首先看到題面,最大 異或 聯想到了什麼?沒錯,線性基。不會的同學請先學習 線性基。但是這道題,因為是在圖里,所以不能直接簡單地用線性基求解。觀察題目中的圖,我們可以發現 嗎?答案一定是由從 1 到 n 的一條路徑上的異或和以及若干環上的異或和構成的。首先我們要理清乙個問題 從 1 到 n 的路徑不用...