zoukankan      html  css  js  c++  java
  • [WC2011]最大XOR和路径

    我们首先给出结论:
    我们随便找一颗生成树
    把单元环拉进线性基。
    单元环定义为:仅由一条非树边构成的环。
    我们可以证明任意大环一定都一个或多个环的点集异或。
    读者可以自己画图证明一下。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define LL long long
    LL num[70];
    bool insert(LL x) {
        for (int i=63;i>=0;i--)
            if ((x>>i)&1) {
                if (!num[i]) {
                    num[i]=x;
                    return true;
                }
                x^=num[i];
            }
        return false;
    }
    LL query(LL x) {
        LL res=x;
        for (int i=63;i>=0;i--)
            if ((res^num[i])>res)
                res^=num[i];
        return res;
    }
    struct edge {
        int to,next;
        LL w;
    }e[200010];
    int head[50010],ecnt;
    inline void adde(int from,int to,LL w) {
        e[++ecnt]=(edge){to,head[from],w},head[from]=ecnt;
        e[++ecnt]=(edge){from,head[to],w},head[to]=ecnt;
    }
    int vis[50010];LL del[50010];
    void dfs(int u,LL res) {
        del[u]=res,vis[u]=1;
        for (int i=head[u];i;i=e[i].next)
            if (!vis[e[i].to]) dfs(e[i].to,res^e[i].w);
            else insert(res^e[i].w^del[e[i].to]);
    }
    int main() {
        int n,m,a,b;LL c;scanf("%d%d",&n,&m);
        for (int i=1;i<=m;i++) scanf("%d%d%lld",&a,&b,&c),adde(a,b,c);
        dfs(1,0);
        printf("%lld\n",query(del[n]));
    }
    
  • 相关阅读:
    定时机制
    选择排序
    二分插入排序
    无名管道pipe
    Makefile
    Python下划线与命名规范
    Django IDE 开发环境的搭建
    Apache如何添加虚拟目录
    在Eclipse下如何安装插件
    Python的模块、包等概念的理解
  • 原文地址:https://www.cnblogs.com/dixiao/p/15692300.html
Copyright © 2011-2022 走看看