首先我们可以将这张图转化为一棵树,其中可能有好多环,肯定是从1走到N,其中可能经过好多环,

因为我们不走N在的一支,最后还是会走回来,因为a xor b xor b=a,所以相当于没走,就是走了个环,

那么我们这个题可以转化成有若干个环的值,还有1-n的值,在环中全任意个,xor起来再xor 1-n的,

使最后最大。

求环的时候我们可以记下每个点的一个值,代表从1到这个点的路径值xor,用size表示(我英语不好。。。)

那么我们做一遍dfs,如果X访问到已经走过的点P了,那么就出现了环,环中的值就是SIZE[p] xor size[x] xor len[q]

这样我们就得到了环的值。

这里的环不一定是所有的环,可能有些环得不到,但是通过已知的值可以xor出来

那么问题就被成功的转化了,这时我们需要了解一些性质

假设集合A,其中我们将ai替换成ai xor a[j] i<>j,那么得到的新集合,这个集合中元素能xor出的值于集合A相同

那么我们就用类似于高斯消元的方法,将每个数(环的值)弄成二进制来看(只是来看),从高位找起,如果所有二进制

最高位是i,那么找到一个最高位是I的元素,用a[i] xor a[j] 替换所有最高位是I的元素j,那么这个集合可以看成是不变的

(能得出的值不变),并且将I元素移出A集合,直到集合中没有数为止

那么我们可以得到一些移出集合的值(也叫做第I位的基),我们从最高位开始贪心,设1-n的xor是ans,那么我们看ans的I位

是不是1,如果不是那么就xor上第I位的基,最后输出ans就行了

  1. /**************************************************************
  2.     Problem:
  3.     User: BLADEVIL
  4.     Language: Pascal
  5.     Result: Accepted
  6.     Time: ms
  7.     Memory: kb
  8. ****************************************************************/
  9.  
  10. //By BLADEVIL
  11. var
  12.     n, m                            :int64;
  13.     pre, other                      :array[..] of int64;
  14.     len                             :array[..] of int64;
  15.     last                            :array[..] of int64;
  16.     l                               :int64;
  17.     a                               :array[..] of int64;
  18.     flag                            :array[..] of boolean;
  19.     size                            :array[..] of int64;
  20.     tot                             :int64;
  21.     ans                             :int64;
  22.      
  23. procedure swap(var a,b:int64);
  24. var
  25.     c                               :int64;
  26. begin
  27.     c:=a; a:=b; b:=c;
  28. end;   
  29.  
  30. procedure connect(x,y:int64;z:int64);
  31. begin
  32.     inc(l);
  33.     pre[l]:=last[x];
  34.     last[x]:=l;
  35.     other[l]:=y;
  36.     len[l]:=z;
  37. end;
  38.  
  39. procedure dfs(x:int64);
  40. var
  41.     q, p                            :int64;
  42. begin 
  43.     flag[x]:=true;
  44.     q:=last[x];
  45.     while q<> do
  46.     begin
  47.         p:=other[q];
  48.         if not flag[p] then
  49.         begin
  50.             size[p]:=size[x] xor len[q];
  51.             dfs(p);
  52.         end else
  53.         begin
  54.             inc(tot);
  55.             a[tot]:=size[x] xor len[q] xor size[p];
  56.             if a[tot]= then dec(tot);
  57.         end;
  58.         q:=pre[q];
  59.     end;
  60. end;
  61.  
  62. procedure init;
  63. var
  64.     i                               :longint;
  65.     x, y                            :int64;
  66.     z                               :int64;
  67. begin
  68.     read(n,m);
  69.     for i:= to m do
  70.     begin
  71.         read(x,y,z);
  72.         connect(x,y,z);
  73.         connect(y,x,z);
  74.     end;
  75.     dfs();
  76. end;
  77.     
  78. procedure qs(low,high:int64);
  79. var
  80.     i, j                            :longint;
  81.     xx                              :int64;
  82. begin
  83.     i:=low; j:=high; xx:=a[(i+j) div ];
  84.     while i<j do
  85.     begin
  86.         while a[i]>xx do inc(i);
  87.         while a[j]<xx do dec(j);
  88.         if i<=j then
  89.         begin
  90.             swap(a[i],a[j]);
  91.             inc(i); dec(j);
  92.         end;
  93.     end;
  94.     if i<high then qs(i,high);
  95.     if j>low then qs(low,j);
  96. end;
  97.     
  98. procedure main;
  99. var
  100.     i, j, k                         :longint;
  101.     cur                             :int64;
  102.      
  103. begin
  104.     fillchar(flag,sizeof(flag),false);
  105.     cur:=<<;
  106.     for i:= to do
  107.     begin
  108.         for j:= to tot do
  109.         if not flag[j] then
  110.             if a[j] and cur=cur then
  111.             begin
  112.                 flag[j]:=true;
  113.                 for k:= to tot do
  114.                     if (not flag[k]) and (a[k] and cur=cur) then
  115.                         a[k]:=a[k] xor a[j];
  116.                 break;
  117.             end;
  118.         cur:=cur>>;
  119.     end;
  120.     qs(,tot);
  121.     ans:=size[n];
  122.     for i:= to tot do
  123.     begin
  124.         if a[i]= then break;
  125.         if ans xor a[i]>ans then ans:=ans xor a[i];
  126.     end;
  127.     writeln(ans);
  128. end;
  129.     
  130. begin
  131.     init;
  132.     main;
  133. end.

bzoj 2115 路径xor和最大值的更多相关文章

  1. BZOJ 2115: [Wc2011] Xor

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 2794  Solved: 1184 [Submit][Stat ...

  2. BZOJ.2115.[WC2011]Xor(线性基)

    题目链接 \(Description\) 给定一张无向带边权图(存在自环和重边).求一条1->n的路径,使得路径经过边的权值的Xor和最大.可重复经过点/边,且边权和计算多次. \(Soluti ...

  3. BZOJ 2115: [Wc2011] Xor DFS + 线性基

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MB Description Input 第一行包含两个整数N和 M, 表示该无向图中 ...

  4. bzoj 2115: [Wc2011] Xor xor高斯消元

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 797  Solved: 375[Submit][Status] ...

  5. bzoj 2115 [Wc2011] Xor——路径和环的转化

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 思路很精妙.好像能应用到很多地方. 发现如果路径上有环,可以通过一些走法达到 异或了那 ...

  6. bzoj 2115 [Wc2011] Xor 路径最大异或和 线性基

    题目链接 题意 给定一个 \(n(n\le 50000)\) 个点 \(m(m\le 100000)\) 条边的无向图,每条边上有一个权值.请你求一条从 \(1\)到\(n\)的路径,使得路径上的边的 ...

  7. BZOJ 2115: [Wc2011] Xor [高斯消元XOR 线性基 图]

    啦啦啦 题意: N 个点M条边的边带权的无向图,求1到n一条XOR和最大的路径 感觉把学的东西都用上了.... 1到n的所有路径可以由一条1到n的简单路径异或上任意个简单环得到 证明: 如果环与路径有 ...

  8. BZOJ 2115 Wc2011 Xor DFS+高斯消元

    标题效果:鉴于无向图.右侧的每个边缘,求一个1至n路径,右上路径值XOR和最大 首先,一个XOR并能为一个路径1至n简单的路径和一些简单的XOR和环 我们开始DFS获得随机的1至n简单的路径和绘图环所 ...

  9. bzoj 2115: [Wc2011] Xor【线性基+dfs】

    -老是想到最长路上 其实可以这样:把每个环的xor和都存起来,然后任选一条1到n的路径的xor和ans,答案就是这个ans在环的线性基上跑贪心. 为什么是对的--因为可以重边而且是无相连通的,并且对于 ...

随机推荐

  1. 关于相对布局RelativeLayout的各种属性介绍

    RelativeLayout相对布局是个人觉得在android布局中比较常用且好用的一个,当然如果想让布局更漂亮是需要多种布局混合搭建的,这里就需要更深入的学习了,在这只介绍下有关相对布局的东西. 相 ...

  2. 「暑期训练」「基础DP」 Piggy-Bank (HDU-1114)

    题意与分析 完全背包问题. 算法背包九讲里面都有提到过,我自己再说下对完全背包的理解. 为什么01背包中遍历状态从VV到00?考虑一下基本方程$dp[i][j]=max(dp[i-1][j-w[i]] ...

  3. linux内存

    在Linux的世界中,从大的方面来讲,有两块内存,一块叫做内存空间,Kernel Space,另一块叫做用户空间,即User Space.它们是相互独立的,Kernel对它们的管理方式也完全不同 驱动 ...

  4. Vue学习(二):class与style绑定

    <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml&q ...

  5. 分布式一致性算法之Paxos原理剖析

    概述 Zookeeper集群中,只有一个节点是leader节点,其它节点都是follower节点(实际上还有observer节点,不参与选举投票,在这里我们先忽略,下同).所有更新操作,必须经过lea ...

  6. 在 C/C++ 中使用 TensorFlow 预训练好的模型—— 间接调用 Python 实现

    现在的深度学习框架一般都是基于 Python 来实现,构建.训练.保存和调用模型都可以很容易地在 Python 下完成.但有时候,我们在实际应用这些模型的时候可能需要在其他编程语言下进行,本文将通过 ...

  7. C++ 递归读取目录下所有文件

    windows版本 #include <iostream> #include <io.h> #include <fstream> #include <stri ...

  8. Z.XML-Cocos2d-x开发笔记

    大家都在热火朝天的使用Cocos2d-x引擎做游戏开发,那么大家不妨把过程中解决的关键问题记录在这里,做一个分享! 1.在Android平台下打开网页 1.1修改项目工程源文件 在你的项目工程源文件中 ...

  9. [译]如何比较同一分支上的不同commit的代码区别?

    原文来源:https://stackoverflow.com/questions/3338126/how-do-i-diff-the-same-file-between-two-different-c ...

  10. HBase 高可用性

    1.Replication 之 Master <--> Master 互备 Master1 (所用zookeeper所处节点 hadoop[01-05] ): -- add_peer '1 ...