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

题解

我们考虑如何得到答案,首先所有的环都是可以经过的。这是为什么呢?

假设我们从$1$号点开始走,走到一个环的起点,然后我们经过这个环以后回到了环的起点,这时我们可以直接回到起点。这样,除了环上的路径,其他的路径都被抵消了。那么我们就只选了了这个环,也就是说,任意一个环都是可以选的。

然后我们先把所有的环都选出来,选入线性基中,再选出任意一条从$1$到$n$的路径,作为初始$ans$。初始$ans$异或线性基的最大值就是我们求的答案。为什么任意选一条路径也是可行的呢?

我们选了一条路径以后,如果存在一条更优的路径,那么这两条路径肯定是构成一个环的,会被选入线性基中。那么我们再用初始的$ans$异或一下这个环,我们就会发现,初始的$ans$被抵消了,二更优的那条路径留了下来。所以,我们选一个任意的初始$ans$是可行的。

于是这道题的实现就很明显了。先找出所有环,构成线性基,然后找出初始$ans$。这两步显然是可以$dfs$一遍一起搞的。然后用$ans$去异或线性基。从高位开始往低位异或。如果当前$ans$异或这一位的数能使$ans$变大,那么就异或。最终得到的$ans$就是我们要求的答案。

补充谈谈对取出环的异或值的理解:

我们记$d[u]$为从根节点,到$u$节点这条路径上的$xor$和,那么假设我们$dfs$拓展路径的时候,我们找到了以前一个访问过的点$v$,

那么这里就构成了一个环,且由于是$dfs$实现的,很容易知道$d[u]=d[v]⊕w_1⊕w_2⊕...$,$w$为边权。

我们记我们插入线性基的元素(环上的$xor$和)为$x$,$x=w_1⊕w_2⊕...⊕w_i$,

因为我们知道$a⊕a=0$,那么$x=d[u]⊕d[u]⊕w_1⊕w_2⊕...⊕w_i$$=d[u]⊕d[v]⊕w_i$($w_i$为$u->v$的边权)

 1 //It is made by Awson on 2017.9.21
 2 #include <set>
 3 #include <map>
 4 #include <cmath>
 5 #include <ctime>
 6 #include <queue>
 7 #include <stack>
 8 #include <string>
 9 #include <cstdio>
10 #include <vector>
11 #include <cstdlib>
12 #include <cstring>
13 #include <iostream>
14 #include <algorithm>
15 #define Min(a, b) ((a) < (b) ? (a) : (b))
16 #define Max(a, b) ((a) > (b) ? (a) : (b))
17 #define LL long long
18 using namespace std;
19 const int N = 50000;
20 const int M = 100000;
21 LL st[64];
22
23 int n, m, u, v;
24 LL c;
25 struct tt {
26     int to, next;
27     LL cost;
28 }edge[2*M+5];
29 int path[N+5], top;
30 LL d[N+5];
31 LL p[64];
32 bool vis[N+5];
33
34 LL getmax(LL x) {
35     for (int i = 62; i >= 0; i--)
36         if ((x^p[i]) > x)
37             x ^= p[i];
38     return x;
39 }
40 void insert(LL x) {
41     for (int i = 62; i >= 0; i--)
42         if (x&st[i]) {
43             if (!p[i]) {
44                 p[i] = x;
45                 break;
46             }
47             x ^= p[i];
48         }
49 }
50 void add(int u, int v, LL c) {
51     edge[++top].to = v;
52     edge[top].cost = c;
53     edge[top].next = path[u];
54     path[u] = top;
55 }
56 void dfs(int u) {
57     vis[u] = 1;
58     for (int i = path[u]; i; i = edge[i].next) {
59         if (vis[edge[i].to]) insert(d[u]^d[edge[i].to]^edge[i].cost);
60         else {
61             d[edge[i].to] = d[u]^edge[i].cost;
62             dfs(edge[i].to);
63         }
64     }
65 }
66 void work() {
67     st[0] = 1;
68     for (int i = 1; i < 63; i++) st[i] = st[i-1]<<1;
69     for (int i = 1; i <= m; i++) {
70         scanf("%d%d%lld", &u, &v, &c);
71         add(u, v, c); add(v, u, c);
72     }
73     dfs(1);
74     LL ans = getmax(d[n]);
75     printf("%lld\n", ans);
76 }
77 int main() {
78     while (~scanf("%d%d", &n, &m))
79         work();
80     return 0;
81 }

转载于:https://www.cnblogs.com/NaVi-Awson/p/7568739.html

[WC 2011]Xor相关推荐

  1. [HNOI 2011]XOR和路径

    Description 给定一个无向连通图,其节点编号为 1 到 N,其边的权值为非负整数.试求出一条从 1 号节点到 N 号节点的路径,使得该路径上经过的边的权值的"XOR 和" ...

  2. WC 2011 joy

    此题神矣...一开始我先想的第二问...想到一个线段树做法...对于最优子序列的下标序列,i[2k]~i[2k+1]这段区间选一个最小值位置为pos再在pos~i[2k+1]选一个最大值,更新答案.. ...

  3. CF662C-Binary Table【FWT】

    正题 题目链接:https://www.luogu.com.cn/problem/CF662C 题目大意 n∗mn*mn∗m的网格上有0/10/10/1,可以任意翻转行和列,求剩下最少的111. 解题 ...

  4. linux sort,uniq,cut,wc命令详解

    linux sort,uniq,cut,wc命令详解 sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些 ...

  5. 这是目录以下是本人认为wc的C++

    同理qt也一样!作者: 时间: 出处: 缩略图: 标题:index for wc solution内容: 这是目录以下是本人认为wc的C++可做题(即有意义的)ok表示2002:fence(ok) h ...

  6. 2011年成都信息工程学院第二季极客大挑战逆向第三题Game破文

    [文章标题]: 2011年成都信息工程学院第二季极客大挑战逆向第三题Game破文 [文章作者]: JoyChou [软件名称]: Game [软件大小]: 176KB [下载地址]: http://w ...

  7. linux02-自动部署、awk/sed/cron/cut/wc/uniq

    自动部署 boot.sh #!/bin/bash SERVERS="192.168.250.131 192.168.250.132" PASSWORD=root BASE_SERV ...

  8. 微软CRM 2011 新功能之三:可新增客户化活动类型实体

    微软CRM4.0标准功能提供任务.传真 .电话联络.电子邮件.手机短信.约会.服务活动和市场活动响应等8种活动类型,除此之外无法 新增客户化的活动类型,随着社会的发展已经无法满足现代商业业务的需求,比 ...

  9. [Buzz.Today]2011.05.25

    >> VMWare的Open Source Pass - CloudFoundry VMWare推出了开源Pass:CloudFoundary,但是现在只是支持少数几种语言与环境:Java ...

最新文章

  1. “cvSnakeImage”: 找不到标识符
  2. Stimulsoft reports .net中创建变量
  3. “阿法狗”之父:关于围棋,人类3000年来犯了一个错
  4. AdvancedEAST高效场景文本检测(附Github地址)
  5. python高阶函数_python_bomb----高阶函数
  6. C#网站发布在IIS10上,Access数据库读取为空白的解决方案
  7. python标准库——sys模块
  8. 数据库 索引超出了数组界限
  9. java宿舍管理系统代码_JAVA学生宿舍管理系统
  10. 服务器多开虚拟机怎么使用教程,游戏多开,你需要这个虚拟机教程
  11. javaWeb上传文件(jsp上传文件)
  12. C++一个简单的弹窗程序
  13. 计算机系统从本地硬盘启动设置,技嘉主板电脑在BIOS中设置硬盘启动教程
  14. 五分钟读完《人性的弱点》
  15. windows管理信息服务器不可用,Windows提示 错误: RPC 服务器不可用 解决方法。
  16. 大学计算机技巧讲座新闻稿,计算机科学与技术名家讲座系列报道(王希胤)
  17. 主窗口(10):【类】QWidgetAction [官翻]
  18. 计算机数字音乐我的梦,我的音乐梦
  19. 处理python SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: trun
  20. 如何调教ChatGPT

热门文章

  1. java NIO模型和三大核心原理
  2. python打开文件报错无效序列_psycopg2.DataError:编码“UTF8”的字节序列无效:0xa0
  3. python while函数_详解python while 函数及while和for的区别
  4. 如果有一天,我们和甲方交换身份…
  5. 盘点 2022 云原生实战峰会产品发布
  6. Spring Cloud Bus 消息总线介绍
  7. 阿里巴巴的 Kubernetes 应用管理实践经验与教训
  8. 水准网测量平差matlab_【干货】史诗级测量大神分享道路测量全过程经验
  9. matlab中线性变压器,用MATLAB优化计算差动变压器的线性范围
  10. jmeter+mysql+set_Jmeter中如何进行对数据库压测(上)