[WC2011] 最大XOR和路径 / CF845G Shortest Path Problem?
不妨先了解几个前置知识/引理:
异或的抵消性质:
引理
: , 所有路径的边权异或和都等于 ( 为节点 到根路径上边权的异或和)
上述引理根据异或的抵消性可得。
引理
:对于一般图 ,我们任取一颗 树。那么图上所有的环都可以用只包含了一条非树边的简单环异或出来。
引理
:对于图上两点间的任意路径(我们只关心边权的异或和),必定可以由 树上的树边路径以及图中一些环异或出来。
依旧是利用异或的抵消性质得到。
我们回到题目中。假设输入的图是一棵树,那么直接
但输入的可能是一般图——我们任取一颗
点击查看代码
#include <bits/stdc++.h>
#define FL(i, a, b) for(int i = (a); i <= (b); i++)
#define FR(i, a, b) for(int i = (a); i >= (b); i--)
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
struct E{int v; ll w;}; vector<E> e[N];
int n, m, vis[N]; ll dis[N];
struct LinearBasis{
ll a[65];
int insert(ll x){
FR(i, 62, 0) if((x >> i) & 1){
if(!a[i]){a[i] = x; return 1;}
else x ^= a[i];
}
return 0;
}
ll qmin(ll ret = 0){
FR(i, 62, 0) ret = min(ret, ret ^ a[i]);
return ret;
}
} b;
void dfs(int u, int fa){
vis[u] = 1;
for(const auto &p: e[u]) if(p.v != fa){
if(!vis[p.v])
dis[p.v] = dis[u] ^ p.w, dfs(p.v, u);
else b.insert(dis[u] ^ dis[p.v] ^ p.w);
}
}
int main(){
scanf("%d%d", &n, &m);
FL(i, 1, m){
int u, v; ll w;
scanf("%d%d%lld", &u, &v, &w);
e[u].emplace_back((E){v, w});
e[v].emplace_back((E){u, w});
}
dfs(1, 0);
printf("%lld\n", b.qmin(dis[1] ^ dis[n]));
return 0;
}
分类:
题目 / CodeForces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】