传送门 :
题意给你一个无向有权图(含环),求一条从 1 − N 1 - N 1−N的路径上,异或和最大
思路这道题,虽然看完题解之后感觉异常简单,但是撸起来还是非常困难的
首先 : 如果没有环,那么只需要求 v [ 1 ] x o r . . . . . v [ N ] v[1] xor.....v[N] v[1]xor.....v[N]即可
但是因为有环的参与,导致答案会被环更新,由于到环的距离来回一次所以不考虑
因此答案最后是 v [ 1 ] x o r . . . v [ N ] v[1] xor ...v[N] v[1]xor...v[N]
但是可能存在多条直达 1 − N 1-N 1−N的路径,但是因为无向图,多条路径可看成一个环,因此不考虑
所以最后我们只需要求 一条路径 xor 多个环 m a x max max
前者可以使用 d f s dfs dfs求出,后者使用 线性基 即可
参考 : 博文链接
虽然简单,但是 d e b u g debug debug半小时之久 第一 : 没看 M M M的范围,导致 R E RE RE 第二 : 没开 L L LL LL 第三 : 异或优先级低于 > > >
Mycode#define int long long
const int N = 1e5+100;
struct node{
int to,val;
};
vector g[N];
ll st[N],dist[N];
ll p[N];
int h[N*2],e[N*2],ne[N*2],w[N*2],idx;
void add(int a,int b,int c){
e[++idx] = b , ne[idx] = h[a] , w[idx] = c,h[a] = idx;
}
void xor_insert(ll x){
for(int i = 63 ; i>= 0 ; i -- ){
if(!(x >>(ll)i)){
continue;
}
if(!p[i]){
p[i] = x;
break;
}
x ^= p[i];
}
}
void dfs(int u,ll val){
dist[u] = val;
st[u] = 1;
for(int i =h[u];i;i=ne[i]){
int j = e[i];
if(!st[j]) dfs(j,val^w[i]);
else xor_insert(val^dist[j]^w[i]);
}
// for(auto x : g[u]){
// if(!st[x.to]) dfs(x.to,val^x.val);
// else xor_insert(val^dist[x.to]^x.val);
// }
}
void solve()
{
int n,m;
cin>>n>>m;
for(int i=1;i>a>>b>>c;
// g[a].pb({b,c});
// g[b].pb({a,c});
add(a,b,c);add(b,a,c);
}
dfs(1,0);
ll ans = dist[n];
for(int i =63;i>=0;i -- ){
if( (ans ^p[i]) > ans)
ans^=p[i];
}
cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?