2115: [Wc2011] Xor (线性基+dfs)
2115: [Wc2011] Xor
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 5714 Solved: 2420
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2115
Description:

Input:
第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目。 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边。 图中可能有重边或自环。
Output:
仅包含一个整数,表示最大的XOR和(十进制结果),注意输出后加换行回车。
Sample Input:
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.环没在路径上,那么此时我们走的时候就是通过若干点到那个环,然后又从那若干点回来,最终对答案有贡献的就只有环的异或和;
2.环在路径上,此时我们将这个环与原路径异或一下,那么原路径与环重叠部分就会抵消,然后会形成一条新的更优的路径。
那么此时如果我们将环与路径的最大异或值找出来,最终也是一条路径和若干环,这时就考虑利用线性基来求异或最大值。
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ,M = ;
int n,m,tot,num;
int head[N],vis[N];
ll x[N],cir[N<<];
struct Edge{
int u,v,next;
ll w;
}e[M<<];
void adde(int u,int v,ll w){
e[tot].v=v;e[tot].next=head[u];e[tot].w=w;head[u]=tot++;
}
void dfs(int u,int fa){
vis[u]=;
for(int i=head[u];i!=-;i=e[i].next){
int v=e[i].v;
if(v==fa) continue ;
if(!vis[v]){
x[v]=x[u]^e[i].w;
dfs(v,u);
}else{
cir[++num]=x[v]^x[u]^e[i].w;
}
}
}
ll p[];
ll ans;
void xor_base(){
for(int i=;i<=num;i++){
for(ll j=;j>=;j--){
if((1LL<<j)&cir[i]){
if(!p[j]){
p[j]=cir[i];
break;
}
cir[i]^=p[j];
}
}
}
}
int main(){
ios::sync_with_stdio(false);cin.tie();
cin>>n>>m;
memset(head,-,sizeof(head));tot=num=;
for(int i=;i<=m;i++){
int u,v;ll w;
cin>>u>>v>>w;
adde(u,v,w);adde(v,u,w);
}
dfs(,-);
ans=x[n];
xor_base();
for(int i=;i>=;i--){
ans=max(ans,ans^p[i]);
}
cout<<ans;
return ;
}
2115: [Wc2011] Xor (线性基+dfs)的更多相关文章
- BZOJ 2115: [Wc2011] Xor 线性基 dfs
https://www.lydsy.com/JudgeOnline/problem.php?id=2115 每一条从1到n的道路都可以表示为一条从1到n的道路异或若干个环的异或值. 那么把全部的环丢到 ...
- BZOJ.2115.[WC2011]Xor(线性基)
题目链接 \(Description\) 给定一张无向带边权图(存在自环和重边).求一条1->n的路径,使得路径经过边的权值的Xor和最大.可重复经过点/边,且边权和计算多次. \(Soluti ...
- BZOJ 2115 [Wc2011] Xor ——线性基
[题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ...
- 【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之间存在 一条权值为 ...
- BZOJ 2115: [Wc2011] Xor DFS + 线性基
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MB Description Input 第一行包含两个整数N和 M, 表示该无向图中 ...
- BZOJ 2115: [Wc2011] Xor
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2794 Solved: 1184 [Submit][Stat ...
- 2115: [Wc2011] Xor
2115: [Wc2011] Xor 链接 分析: 对于图中的一个环,是可以从1到这个环,转一圈然后在回到1的,所以可以一开始走很多个环,然后在走一条1到n的路径. 那么可以求出所有的环,加入到线性基 ...
- bzoj 2115: [Wc2011] Xor xor高斯消元
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 797 Solved: 375[Submit][Status] ...
随机推荐
- Response对象及常用方法
void addCookie(Cookie cookie)给客户端添加一个Cookie对象,以保存客户端的信息 void addDateHeader(String name,long value) 添 ...
- python 终极篇 --- django 路由系统
URL配置 基本格式: from django.conf.urls import url urlpattern ...
- 【springmvc+mybatis项目实战】杰信商贸-1.项目背景
1.项目背景杰信项目物流行业的项目,杰信商贸是国际物流行业一家专门从事进出口玻璃器皿贸易的公司.公司总部位于十一个朝代的帝王之都西安,业务遍及欧美.随着公司不断发展壮大,旧的信息系统已无法满足公司的快 ...
- Redis 数据结构服务器
Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久 ...
- python常用命令—‘\r’
# \r 默认表示将输出的内容返回到第一个指针,这样的话,后面的内容会覆盖前面的内容 如常用的显示程序完成进度!!
- SIG蓝牙mesh笔记2_mesh组成
目录 SIG 蓝牙 mesh 组成 mesh网络概述 网络和子网 设备和节点 devices & nodes 入网 mesh中的几个概念 智能插座例子 SIG 蓝牙 mesh 组成 mesh网 ...
- Python高级编程-多进程
要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回 ...
- 转:Linux 编译安装 Mysql5.7
http://broqiang.com/2017/04/18/Mysql-Install-5.7.18-Linux-Compile/ 原文 Linux 编译安装 Mysql5.7 Ubuntu 下快速 ...
- Swift-函数的理解
/* 函数(Function) 函数是为执行特定功能的自包含的代码块.函数需要给定一个特定标识符(名字),然后当需要的时候, 就调用此函数来执行功能. */ // 函数的定义与调用 // 定义函数时, ...
- 3dContactPointAnnotationTool开发日志(二)
今天看的时候发现其实www的方式是可以根据指定路径读取本地图片到Image中的.也就是昨天提到的第二种方式. 随便选了个图片做示范: 修改后的代码如下: using System.Collec ...