BZOJ 2115 DFS+高斯消元
2024-09-05 16:25:50
思路:
先搞出来所有的环的抑或值 随便求一条1~n的路径异或和
gauss消元找异或和最大 贪心取max即可
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 200050
#define int long long
int n,m,xx,yy,zz,w[N],v[N],next[N],first[N],tot,vis[N],d[N],stk[N],tp;
void Add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void add(int x,int y,int z){Add(xx,yy,zz),Add(yy,xx,zz);}
void dfs(int x){
vis[x]=1;
for(int i=first[x];~i;i=next[i]){
if(!vis[v[i]])d[v[i]]=d[x]^w[i],dfs(v[i]);
else if(d[v[i]]^d[x]^w[i])stk[++tp]=d[v[i]]^d[x]^w[i];
}
}
void gauss(){
for(int i=1ll<<62,flag=1,j;i;i>>=1){
for(j=flag;j<=tp;j++)if(stk[j]&i)break;
if(j==tp+1)continue;
swap(stk[flag],stk[j]);
for(int k=1;k<=tp;k++){
if(k==flag)continue;
if(stk[k]&i)stk[k]^=stk[flag];
}
flag++;
}
}
signed main(){
memset(first,-1,sizeof(first));
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld",&xx,&yy,&zz);
add(xx,yy,zz);
}
dfs(1),gauss();
for(int i=1;i<=tp;i++)d[n]=max(d[n],d[n]^stk[i]);
printf("%lld\n",d[n]);
}
最新文章
- Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析
- C#获得类的方法和方法参数
- linux 创建连接命令 ln -s 软链接
- 再谈自主开发与企业IT管理
- 也谈谈 Redis 和 Memcached 的区别
- 通俗易懂的讲解iphone视图控制器的生命周期
- shell之“>;/dev/null 2>;&;1” 详解(转)
- dedecms模版制作活动的折叠菜单
- 由于jsp include 很多文件后导致java类大小超过65535 bytes 的解决方法(转载)
- C# 循环语句
- [转]php 在各种web服务器的运行模式
- Luogu P1690 贪婪的Copy
- 网站开发进阶(十一)如何将一个jsp页面嵌套在另一个页面中
- 如何提高缓存命中率(Redis)
- 集合源码分析[1]-Collection 源码分析
- Oracle11g版本中未归档隐藏参数
- 42-字符串到json 的错误 com.alibaba.fastjson.JSONObject cannot be cast to java.lang.String
- Mysql 经典案例总结(学习之前需要有Mysql基础)01
- [c/c++]指针(1)
- 通过Chrome的inspect对手机webview进行调试