• 洛谷 P4151 [WC2011]最大XOR和路径 解题报告


    P4151 [WC2011]最大XOR和路径

    题意

    求无向带权图的最大异或路径

    范围


    思路还是很厉害的,上午想了好一会儿都不知道怎么做

    先随便求出一颗生成树,然后每条返祖边都可以出现一个环,从的路径上走到环绕一圈再走回来去和回来的路径抵消,于是对每个环加入线性基,询问一下路径在上面的最大值就行了


    Code:

    #include <cstdio>
    #define ll long long
    const int N=5e4+10;
    const int M=2e5+10;
    int head[N],to[M],Next[M],cnt;
    ll edge[M],base[65];
    void add(int u,int v,ll w)
    {
        to[++cnt]=v,edge[cnt]=w,Next[cnt]=head[u],head[u]=cnt;
    }
    void ins(ll bee)
    {
        for(int i=62;~i;i--)
            if(bee>>i&1)
            {
                if(base[i]) bee^=base[i];
                else {base[i]=bee;break;}
            }
    }
    ll qry(ll bee)
    {
        for(int i=62;~i;i--)
            if(!(bee>>i&1))
                bee^=base[i];
        return bee;
    }
    int vis[N],n,m;ll dis[N];
    void dfs(int now,ll bee)
    {
        dis[now]=bee;
        vis[now]=1;
        for(int v,i=head[now];i;i=Next[i])
            if(!vis[v=to[i]])
                dfs(v,bee^edge[i]);
            else
                ins(dis[now]^dis[v]^edge[i]);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        ll w;
        for(int u,v,i=1;i<=m;i++)
        {
            scanf("%d%d%lld",&u,&v,&w);
            add(u,v,w),add(v,u,w);
        }
        dfs(1,0);
        printf("%lld
    ",qry(dis[n]));
        return 0;
    }
    

    2019.1.19

  • 相关阅读:
    Spring Cloud 模块简介2
    Eureka简介
    Spring Cloud 模块简介
    成神之路-基础篇 转
    Java面试题无答案
    java程序猿常用Linux命令
    Java工程师成神之路 转
    大型网站技术架构 大纲
    Mockito 相关资料
    webApp路由控制-vue-router2.0
  • 原文地址:https://www.cnblogs.com/butterflydew/p/10292911.html
Copyright © 2020-2023  润新知