题目链接

\(Description\)

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

\(Solution\)

来找一些性质。从一个点出发,到达任意一个点后原路返回,那么得到的和仍为0。但是如果走完一个环后原路返回,则会得到这个环的Xor和。

那么从1点就可以得到任何一个环的Xor和。我们还需要一条1->n的路径,使得搭配上某些环后答案最大。于是我们就可以对环的权值构造线性基,拿路径Xor和在上面求最大值。

选取哪条路径呢?如果存在多条1->n的路径,实际上任意两条也构成了一个环,我们也已统计在内了。

即我们可以任意选取一条1->n的路径(反复走显然没啥用),如果它不更优,会在与某个环Xor后换成一条更优的路径。(同理,对于路径上点的选择也是任意的。所有环都要算上)

  1. //6016kb 500ms
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. //#define gc() getchar()
  6. #define MAXIN 100000
  7. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  8. typedef long long LL;
  9. const int N=5e4+5,M=2e5+5;
  10. int n,Enum,H[N],nxt[M],to[M];
  11. LL base[69],len[M],val[N];
  12. bool vis[N];
  13. char IN[MAXIN],*SS=IN,*TT=IN;
  14. inline int read()
  15. {
  16. int now=0;register char c=gc();
  17. for(;!isdigit(c);c=gc());
  18. for(;isdigit(c);now=now*10+c-'0',c=gc());
  19. return now;
  20. }
  21. inline LL readll()
  22. {
  23. LL now=0;register char c=gc();
  24. for(;!isdigit(c);c=gc());
  25. for(;isdigit(c);now=now*10+c-'0',c=gc());
  26. return now;
  27. }
  28. inline void AddEdge(LL w,int u,int v)
  29. {
  30. to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, len[Enum]=w;
  31. to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum, len[Enum]=w;
  32. }
  33. inline void Insert(LL x)
  34. {
  35. for(int i=60; ~i; --i)
  36. if(x&(1ll<<i))
  37. {
  38. if(base[i]) x^=base[i];
  39. else {base[i]=x; break;}
  40. }
  41. }
  42. inline LL Query(LL x)
  43. {
  44. for(int i=60; ~i; --i)
  45. x=std::max(x,x^base[i]);
  46. return x;
  47. }
  48. void DFS(int x,int f)
  49. {
  50. vis[x]=1;
  51. for(int i=H[x],v; i; i=nxt[i])
  52. if(!vis[v=to[i]]) val[v]=val[x]^len[i], DFS(v,x);
  53. else if(v!=f) Insert(val[v]^val[x]^len[i]);
  54. }
  55. int main()
  56. {
  57. n=read();
  58. for(int i=1,m=read(); i<=m; ++i) AddEdge(readll(),read(),read());
  59. DFS(1,1);
  60. printf("%lld\n",Query(val[n]));
  61. return 0;
  62. }

BZOJ.2115.[WC2011]Xor(线性基)的更多相关文章

  1. BZOJ 2115: [Wc2011] Xor 线性基 dfs

    https://www.lydsy.com/JudgeOnline/problem.php?id=2115 每一条从1到n的道路都可以表示为一条从1到n的道路异或若干个环的异或值. 那么把全部的环丢到 ...

  2. BZOJ 2115 [Wc2011] Xor ——线性基

    [题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ...

  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

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

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

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

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

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

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

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

  8. BZOJ2115:[WC2011] Xor(线性基)

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  9. BZOJ - 2115 独立回路 线性基

    题意:给定一个图集\((V,E)\),求路径\(1...n\)的最大异或和,其中重复经过的部分也会重复异或 所求既任意一条\(1...n\)的路径的异或和,再异或上任意独立回路的组合的异或和(仔细想想 ...

随机推荐

  1. Nginx详解十六:Nginx场景实践篇之缓存服务

    缓存类型: 服务端缓存 代理缓存 客户端缓存 Nginx代理缓存 配置语法 使用之前需要先定义一个proxy_cache_path配置语法:proxy_cache_path path [levels= ...

  2. Python继承、方法重写

    继承 在编写类时,并不是每次都要从空白开始.当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率. class one(): "&quo ...

  3. java函数式编程之Supplier

    原创 2016年12月25日 10:02:52 标签: 函数式编程 / java 3250 描述:Supplier< T>接口没有入参,返回一个T类型的对象,类似工厂方法. 源码: pub ...

  4. Django复习

    django复习 django和其他框架的对比 django,集成很多功能的大型框架,为开发者提供了很多方便的组件:orm.form.ModelForm.auth.admin.contenttypes ...

  5. mysql5.7 root用户默认密码

    1. 查找密码 Mysql 5.7 在自动初始化数据库的时候,会生成root用户的默认密码. 通过 grep "temporary password" /var/log/mysql ...

  6. javaScript中的querySelector()与querySelectorAll()的区别

    之前,在JavaScript获取文档元素一文中,我曾介绍了获取文档元素的几种方法,最后一种方法是通过选择器获取文档元素.它的核心思想便是利用querySelector()或querySelectorA ...

  7. python练习册 0002随机生成验证

    这个题需要用到random库的方法,不用就会忘,暂把random库的常用方法贴出来 import random import string # 随机整数 # randint(a, b),生成a~b之间 ...

  8. Elasticsearch索引模板和别名

    创建模板(模板名和索引名一样都不能有大写) PUT http://222.108.x.x:9200/_template/templateds { "template": " ...

  9. JS高级程序设计3

    PS:有一小部分写在了 JS 2017了 JSON <!DOCTYPE html> <html lang="en"> <head> <me ...

  10. python之多线程 queue 实践 筛选有效url

    0.目录 1.背景 某号码卡申请页面通过省份+城市切换归属地,每次返回10个号码. 通过 Fiddler 抓包确认 url 关键参数规律: provinceCode 两位数字 cityCode 三位数 ...