博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2115:[WC2011] Xor(线性基)
阅读量:6440 次
发布时间:2019-06-23

本文共 1174 字,大约阅读时间需要 3 分钟。

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

Solution

首先这个答案肯定是由一条简单路径和几个环构成的。简单路径外的环,我们是可以想用就用的,因为我们可以走到环那里绕一圈再回到起点,这样除了那个环之外别的地方都没有受到影响。

怎么求出所有的环呢?其实就是$DFS$树所有的反祖边和树边构成的环,$DFS$一下就可以找出来了。

我们找出所有的环,再随便找一条$1$到$n$的简单路径,用简单路径的$xor$去在环的线性基里找最大就好了。

为什么随便找一条简单路径是对的呢?因为我们找出的所有环中,肯定有在简单路径上的,这样的话简单路径在异或上这些环后,就会变成一条新的简单路径,这样调整下来最后肯定能得到最优解。

Code

1 #include
2 #include
3 #define N (200009) 4 #define LL long long 5 using namespace std; 6 7 struct Edge{LL to,next,len;}edge[N<<1]; 8 LL n,m,u,v,l,cnt; 9 LL head[N],num_edge;10 LL d[N],Xor[N],Circle[N];11 bool vis[N];12 13 void add(LL u,LL v,LL l)14 {15 edge[++num_edge].to=v;16 edge[num_edge].len=l;17 edge[num_edge].next=head[u];18 head[u]=num_edge;19 }20 21 void Insert(LL x)22 {23 for (int i=62; i>=0; --i)24 if (x&(1ll<
=0; --i)55 ans=max(ans,ans^d[i]);56 printf("%lld\n",ans);57 }

转载于:https://www.cnblogs.com/refun/p/10277334.html

你可能感兴趣的文章
sqlite数据类型 datetime处理
查看>>
在Qt自带例子中添加HideItem,并实现相应Undo和Redo功能
查看>>
用php解析时间戳做时间间隔“几分钟前,几秒前,几小时前”......
查看>>
JavaScript Cookie 的正确用法
查看>>
Android Studio 3.X打开DDMS
查看>>
如何在debian下通过wget安装chrome浏览器
查看>>
豆果第四天
查看>>
Saltstack+Shell自动化分发脚本
查看>>
linux常用命令之压缩及解压
查看>>
collect2: ld returned 1 exit status
查看>>
泛型的概述
查看>>
TWaver矢量小试——Android演进路线图
查看>>
华为手机真机调试设置
查看>>
http 小爬虫
查看>>
“工欲善其事,必先利其器”——UC浏览器研发中实用测试工具
查看>>
字符串转double算法
查看>>
seleect io模型的select操作封装
查看>>
记一次使用dockerfile安装debian并安装好vim,netstat等工具
查看>>
【LeetCode】141 Linked List Cycle (java实现)
查看>>
动态设置软键盘打开会关闭
查看>>