题解:P12259 [蓝桥杯 2024 国 Java B] 最优路径
题意:
任意选两个不同的点使得其路径的异或和最小。求出这个值。
思路:
先考虑任意两个点
Tips:
- 求任意两点简单路径异或和:比如
a 到b 的异或和为x ,a 到c 的异或和为y 。则b 到c 的异或和为x ⊕ y 。 - 那么一个环的异或和呢?把上面那个
c 改成b 即可。即b 再走回b ,不就是一个环吗?void dfs(int u,int fa){ for(auto x:g[u]){ int e=x.first,w=x.second; if(vis[e]){ ins(xo[e]^xo[u]^w);//环的异或和 } else { vis[e]=1; tmp.push_back(e); xo[e]=xo[u]^w; dfs(e,u); } } } - 注意两个点之间可能不连通。需要多次遍历。
- 线性基求最小值贪心即可。
int res=xo[x]^xo[y]; for(int k=31;~k;k--){ if((res^p[k])<res) res=res^p[k]; } ans=min(ans,res);\tiny 谢谢你的观看。