【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS
【BZOJ2115】[Wc2011] Xor
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
HINT
题解:以前用到DFS树的情况比较少,现在需要在加深一下对DFS树的理解了~
*结论:任意一条从1到n的路径,都可以被任意令一条从1到n的路径和一堆环替代。(因为是异或,所以显然)
所以我们只需要任意找一条从1到n的路径,然后再把所有的环都找出来。
但是我们这里的环不是Tarjan那里的环,我们要找到的都是简单环,所以要用DFS(有什么区别?)
因为DFS树(就是DFS找出的树)有一个性质:没有横叉边,所以每条返祖边都唯一对应一个简单环。
那么现在问题就变成了给出一堆数,可以选或不选,要求选出来的数和一个固定的数的异或和最大。
方法:网上大部分题解都说先搞出线性基,然后贪心就行了,然而本蒟蒻不知道什么是线性基,现去学了一发
高斯消元的过程,就是我们将一个满秩的矩阵尽可能的消成一个上三角矩阵的过程,而我对线性基的理解就是:最后得到的那个近似于上三角的矩阵(因为有的位置可能没有消完)。容易发现,线性基可以表示原集合中的所有数。
所以你已经知道了一个上三角矩阵,然后如何使得异或值最大呢?显然从大到小一个一个试就行了嘛!如果当前位线性基不为0,但是原数为0,那就异或上这个数就行了。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
int n,m,cnt,tot;
int to[200010],next[200010],head[50010],vis[50010];
ll val[200010],v[500010],dis[50010],ans;
void add(int a,int b,ll c)
{to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x,int fa)
{vis[x]=1;for(int i=head[x];i!=-1;i=next[i]){if(to[i]==fa) continue;if(vis[to[i]]) v[++tot]=val[i]^dis[to[i]]^dis[x];else dis[to[i]]=dis[x]^val[i],dfs(to[i],x);}
}
void gauss()
{ll i;int j,k=0;for(i=1ll<<60;i;i>>=1){for(k++,j=k;j<=tot;j++) if(v[j]&i){swap(v[j],v[k]);break;}if(!(v[k]&i)){k--; continue;}for(j=k+1;j<=tot;j++) if(v[j]&i) v[j]^=v[k];}
}
int main()
{scanf("%d%d",&n,&m);int i,a,b;ll c;memset(head,-1,sizeof(head));for(i=1;i<=m;i++){scanf("%d%d%lld",&a,&b,&c);add(a,b,c),add(b,a,c);}dfs(1,0),gauss();ans=dis[n];for(i=1;i<=60&&i<=tot;i++) if((ans^v[i])>ans) ans^=v[i];printf("%lld",ans);return 0;
}
转载于:https://www.cnblogs.com/CQzhangyu/p/7044432.html
【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS相关推荐
- 【bzoj2460】[BeiJing2011]元素 贪心+高斯消元求线性基
题目描述 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力越强,但物极必反 ...
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南):签到题A Matrix Equation(高斯消元求线性异或方程组自由元个数)
problem 给出两个n*n的01矩阵,A和B 定义两种运算,Z(i,j)=Xi行*Yj列相加%2,D(i,j)=X(i,j)*Y(i,j) 求最多有多少个可能的矩阵C,满足A运算1C==B运算2C ...
- HDU4870_Rating_双号从零单排_高斯消元求期望
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870 原题: Rating Time Limit: 10000/5000 MS (Java/Other ...
- 洛谷 - P4783 【模板】矩阵求逆(高斯消元求逆矩阵)
题目链接:点击查看 题目大意:给出一个 n * n 的矩阵,求出其逆矩阵,mod 为 1e9 + 7,若不存在输出 No Solution 题目分析:囤个模板,原理就是,初始时在原矩阵右侧设置一个单位 ...
- BZOJ:4820: [Sdoi2017]硬币游戏BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...
- 2020 icpc济南 A - Matrix Equation (高斯消元求自由元个数)
链接: A - Matrix Equation 题意: 给一个 A 矩阵 一个 B 矩阵(矩阵元素为 0 或 1),求有多少个 C 矩阵 满足 A X C = B . C (叉乘 和 点乘). 思路: ...
- 矩阵与高斯消元【矩阵乘法,高斯消元求线性方程组,求行列式】 全网最详,附例题与姊妹篇 一万三千字详解
(详解)矩阵快速幂详解与常见转移矩阵的构造_秦小咩的博客-CSDN博客_矩阵快速幂转移矩阵 目录 矩阵乘法 矩阵快速幂 伪代码模板 例题一 例题2 例题三 例题四 高斯消元 整形高斯消元 浮点型高斯消 ...
- BZOJ 4269: 再见Xor [高斯消元 线性基]
4269: 再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 我太愚蠢了连数组开小了以及$2^{ ...
- 【BZOJ4269】再见Xor 高斯消元
[BZOJ4269]再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整 ...
最新文章
- 对话通信原理系列专题目录
- Robots at Warehouse(搜索+vector的使用)
- C# 关闭正在执行的文件
- 在MVC3项目中结合NInject实现依赖注入
- java 23种设计模式及具体例子 收藏有时间慢慢看
- 阿里云一键建站产品,阿里云自营建站-中小企业建站首选
- unsigned int mysql_mysql 中int类型字段unsigned和signed的探索
- php模糊搜索慢怎么办,MySQL中文模糊检索问题的解决方法_php
- python2.7开发环境搭建_windows python2.7 django 开发环境搭建
- easyUI按钮图表对照大全
- php 还原html,可恢复代码的HTML UI元素PHP
- 量化策略回测01双均线
- nginx 访问控制之 document_uri
- 代码大全(第二版)笔记——高质量的子程序
- 基于JSP的房屋租赁管理系统
- FlashCS6安装步骤
- 第七周-C语言 求方程的共轭复根
- Codevs_P1907HDU_P1565 方格取数3(最大流)
- dsolve()函数求解微分方程
- 投入产出表之影响力系数和感应度系数的计算--基于Excel
热门文章
- Mysql分库分表(Mycat)
- 备战618,京东如何保障系统稳定性?
- 未来我们对微服务和 Serverless 架构有什么期望
- 震惊了!原来这才是 Kafka!(多图+深入)
- 如何向5岁小孩解释什么是支持向量机(SVM)?
- 微服务为什么一定要用docker
- 某小公司 RESTful、共用接口、前后端分离、接口约定的实践
- 【Python】青少年蓝桥杯_每日一题_12.11_开关灯问题
- Android --- Unable to resolve dependency for ‘:app@debug/compileClasspath‘: Could not resolve com.a
- 响应格式html,设置响应格式的HTML邮件