【BZOJ-2115】Xor 线性基 + DFS

2115: [Wc2011] Xor

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 2142  Solved: 893
[Submit][Status][Discuss]

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

Source

Solution

线性基

思路就是先随意一条路径,然后把每个环的存下来,求线性基,再与之前的路径取xor,取最大即为答案

至于线性基,它的意义是:通过原集合S的某一个最小子集S1使得S1内元素相互异或得到的值域与原集合S相互异或得到的值域相同。

然后XJB乱搞一下,具体写的比较明白的还是Oxer  折越

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
long long read()
{
    long long x=0,f=1; char ch=getchar();
    while (ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) f=-1; ch=getchar();}
    while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
#define maxn 500010
#define maxm 5000010
int n,m,num;
struct EdgeNode{int next,to;long long val;}edge[maxm<<1];
int head[maxn],cnt;
void add(int u,int v,long long w) {cnt++; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v; edge[cnt].val=w;}
void insert(int u,int v,long long w) {add(u,v,w); add(v,u,w);}
bool visit[maxn];long long val[maxn],a[maxn];
void DFS(int now)
{
    visit[now]=1;
    for (int i=head[now]; i; i=edge[i].next)
        if (!visit[edge[i].to])
            val[edge[i].to]=val[now]^edge[i].val,DFS(edge[i].to);
        else a[++num]=val[edge[i].to]^edge[i].val^val[now];
}
int Gauss()
{
    int tmp=1;
    for (int p=64; p>=0; p--)
        {
            int t=0;
            for (int j=tmp; j<=num; j++) if ((a[j]>>p)&1) {t=j;break;}
            if (t)
                {
                    swap(a[t],a[tmp]);
                    for (int j=1; j<=num; j++) if (j!=tmp && ((a[j]>>p)&1)) a[j]^=a[tmp];
                    tmp++;
                }
        }
    return tmp-1;
}
int main()
{
    n=read(); m=read();
    for (int u,v,i=1; i<=m; i++) u=read(),v=read(),insert(u,v,read());
    DFS(1);
    long long ans=val[n];
    num=Gauss();
    for (int i=1; i<=num; i++) ans=max(ans,ans^a[i]);
    printf("%lld\n",ans);
    return 0;
}

hsy大爷发题不写题解,程序还是hzwer的翻版

时间: 2024-12-12 00:37:26

【BZOJ-2115】Xor 线性基 + DFS的相关文章

bzoj 2115 Xor - 线性基 - 贪心

题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 问点$1$到点$n$的最大异或路径. 因为重复走一条边后,它的贡献会被消去.所以这条路径中有贡献的边可以看成是一条$1$到$n$的简单路径加上若干个环. 因此可以找任意一条路径,然后找出所有环扔进线性基跑出最大异或和. 但是找出所有环可能会T掉,但是仔细画图发现,并不需要找出所有环,例如: 在上图中,你并不需找出所有的环,只用找出1 - 3 - 4 - 2和3 - 5 - 6 - 4这两个环,它们异或后就能得到环1 -

BZOJ 2115: [Wc2011] Xor 线性基

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2115 解法: 膜:http://www.cnblogs.com/ljh2000-jump/p/5869925.html 这道题要求从1到n的最大xor和路径,存在重边,允许经过重复点.重复边.那么在图上作图尝试之后就会发现,路径一定是由许多的环和一条从1到n的路径组成.容易发现,来回走是没有任何意义的,因为来回走意味着抵消.考虑这道题求得是路径xor和最大,所以必然我们要想办法处理环的情

2115: [Wc2011] Xor (线性基+dfs)

2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 5714  Solved: 2420 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 Description: Input: 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di

BZOJ 2115 [Wc2011] Xor ——线性基

[题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有的简单环都可以经过各种各样的异或得到. 然后线性基,在从高位向低位贪心即可,至于证明,需要拟阵的相关知识. [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath>

Xor HYSBZ - 2115 (线性基)

Xor HYSBZ - 2115 题意:给一个树,求1到n的最长路径.这里的路径定义为异或和. 线性基~~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 struct LiBase{ 5 ll a[63]; 6 //初始化 7 void init(){ 8 memset(a,0,sizeof(a)); 9 } 10 //插入 11 bool insert_(ll x){ 12 for(int

BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]

以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高斯消元判断是否和已选择的线性相关 每一位记录pivot[i]为i用到的行 枚举要加入的数字的每一个二进制为1的位,如果有pivot[i]那么就异或一下(消元),否则pivot[i]=这个数并退出 如果最后异或成0了就说明线性相关... #include <iostream> #include &l

bzoj 4269 再见Xor 线性基

题面 题目传送门 解法 第一问就是线性基的裸题 第二问也很类似,从低位向高位枚举,如果线性基上这一位有数,那么直接异或后返回 时间复杂度:\(O(n\ log\ a_i)\) 代码 #include <bits/stdc++.h> #define int long long using namespace std; template <typename node> void chkmax(node &x, node y) {x = max(x, y);} template

Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS

G. Xor-matic Number of the Graph http://codeforces.com/problemset/problem/724/G 题意:给你一张无向图.定义一个无序三元组(u,v,s)表示u到v的(不一定为简单路径)路径上xor值为s.求出这张无向图所有不重复三元组的s之和.1≤n≤10^5,1≤m≤2*10^5. 想法: 如果做过[Wc2011 xor]这道题目(题解),那么问题变得简单起来了. ①假设我们钦定一个(u,v),设任意一条u->v的路径xor值为X,

【BZOJ2322】[BeiJing2011]梦想封印 高斯消元求线性基+DFS+set

[BZOJ2322][BeiJing2011]梦想封印 Description 渐渐地,Magic Land上的人们对那座岛屿上的各种现象有了深入的了解. 为了分析一种奇特的称为梦想封印(Fantasy Seal)的特技,需要引入如下的概念: 每一位魔法的使用者都有一个“魔法脉络”,它决定了可以使用的魔法的种类. 一般地,一个“魔法脉络”可以看作一个无向图,有N个结点及M条边,将结点编号为1~N,其中有一个结点是特殊的,称为核心(Kernel),记作1号结点.每一条边有一个固有(即生成之后再也不