【BZOJ2115】Xor(线性基)
【BZOJ2115】Xor(线性基)
题面
Description

Input
第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目。 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边。 图中可能有重边或自环。
Output
仅包含一个整数,表示最大的XOR和(十进制结果),注意输出后加换行回车。
Sample Input
5 7
1 2 2
1 3 2
2 4 1
2 5 1
4 5 3
5 3 4
4 3 2
Sample Output
6
HINT

题解
答案是怎么来的?
对于任意一个环,我们一定可以走到某条路径,
使得这条路径的异或和恰好是环的异或和
因此,对于答案有贡献的就是环
所以,\(dfs\)找到所有环的异或和(其实并不是所有环)
这样来想,\(dfs\)强制所有点只能访问一次
这样遍历出来的相当于是一棵生成树
此时,多出来的边就是返祖边
此时形成了环
如果存在更大的环,一定可以表示为两个或更多个小环的异或和
最后把任意一条\(1~n\)路径的异或和丢到线性基里面求最大值就行了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAXL 120000
#define MAX 55555
inline ll read()
{
    RG ll x=0,t=1;RG char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return x*t;
}
struct Line{int v,next;ll w;}e[MAXL<<1];
int h[MAX],cnt=1,n,m;
inline void Add(int u,int v,ll w){e[cnt]=(Line){v,h[u],w};h[u]=cnt++;}
bool vis[MAX];
ll Xor[MAX];
struct xxj
{
	ll p[60];
	void insert(ll x)
	{
		for(int i=59;i>=0;--i)
		{
			if(~x&(1ll<<i))continue;
			if(!p[i]){p[i]=x;break;}
			x^=p[i];
		}
	}
	ll Query(ll x)
	{
		for(int i=59;i>=0;--i)x=max(x,x^p[i]);
		return x;
	}
}G;
void dfs(int u,int ff)
{
	vis[u]=true;
	for(int i=h[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(v==ff)continue;
		if(vis[v])
		{
			G.insert(Xor[u]^Xor[v]^e[i].w);
			continue;
		}
		Xor[v]=Xor[u]^e[i].w;
		dfs(v,u);
	}
}
int main()
{
	n=read();m=read();
	for(int i=1;i<=m;++i)
	{
		int u=read(),v=read();ll w=read();
		Add(u,v,w);Add(v,u,w);
	}
	dfs(1,0);
	printf("%lld\n",G.Query(Xor[n]));
	return 0;
}
【BZOJ2115】Xor(线性基)的更多相关文章
- 【BZOJ-2115】Xor      线性基 + DFS
		2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2142 Solved: 893[Submit][Status] ... 
- BZOJ2115:[WC2011] Xor(线性基)
		Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ... 
- Xor && 线性基练习
		#include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) ... 
- BZOJ.2115.[WC2011]Xor(线性基)
		题目链接 \(Description\) 给定一张无向带边权图(存在自环和重边).求一条1->n的路径,使得路径经过边的权值的Xor和最大.可重复经过点/边,且边权和计算多次. \(Soluti ... 
- HDU3949 XOR (线性基)
		HDU3949 XOR Problem Description XOR is a kind of bit operator, we define that as follow: for two bin ... 
- [hdu3949]XOR(线性基求xor第k小)
		题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #i ... 
- HDU3949 XOR(线性基第k小)
		Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base num ... 
- 2019牛客多校第一场H XOR 线性基模板
		H XOR 题意 给出一组数,求所有满足异或和为0的子集的长度和 分析 n为1e5,所以枚举子集肯定是不可行的,这种时候我们通常要转化成求每一个数的贡献,对于一组数异或和为0.我们考虑使用线性基,对这 ... 
- BZOJ 2115 [Wc2011] Xor ——线性基
		[题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ... 
- BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]
		2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ... 
随机推荐
- bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)
			bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统) cogs zoj bzoj-权限 题解 bzoj和zoj都是骗访问量的233,我没有 ... 
- 学习HTML 第一节.小试牛刀
			此贴并非教学,主要是自学笔记,所述内容只是些许个人学习心得的记录和备查积累,难以保证观点正确,也不一定能坚持完成. 如不幸到访,可能耽误您的时间,也难及时回复,贴主先此致歉.如偶有所得,相逢有缘,幸甚 ... 
- Android错误:can not get file data of lua/start_v2.op [LUA ERROR] [string "require "lua/start_v2””] 已解决
			错误: can not get file data of lua/start_v2.op [LUA ERROR] [string "require "lua/start_v2””] ... 
- MAC清理DS_Store和._文件
			打开终端输入 find . -name .DS_Store -type f -delete ; find . -type d | xargs dot_clean 
- Rest-Assured 测试框架
			Rest-Assured 是一个测试 Restful Web Service 的 Java 类库,我们能够测试各种各样的请求组合,依次测试核心业务逻辑的不同组合. 它是通过发送特定的rest api, ... 
- XSS留言板实现
			XSS 留言板实现-笔记 预备知识 XSS漏洞 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS ... 
- JVM监控及堆栈内存
			jconsole 堆内存:存放new出来的对象 栈内存:存放基本数据结构和对象的引用,但对象本身放在堆中 
- VR产业链全景图
- 随机生成30道四则运算题NEW
			代码: #include <iostream> #include <time.h> using namespace std; void main() { srand((int) ... 
- Improving the Safety, Scalability, and Efficiency of Network Function State Transfers
			Improving the Safety, Scalability, and Efficiency of Network Function State Transfers 来源:ACM SIGCOMM ... 
