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

    分析

    我们发现任取条路径

    对于路径外的环一定可以将它完整的取到

    而对于和路径有交的环相当于用一段新路径代替原来的一段路径

    所以我们只需求出任意一个1到n的路径和图上所有环的值

    然后借助线性基求出异或最大值即可

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back 
    #define li long long
    vector<pair<int,li> >v[100100];
    int n,m,vis[100100];
    li bel[110],d[100100],ans;
    inline void ins(li x){
        for(int i=63;i>=0;i--)
          if((1ll<<i)&x){
              if(!bel[i]){
                bel[i]=x;
                break;
              }
              x^=bel[i];
          }
    }
    inline void q(){
        for(int i=63;i>=0;i--)
          if((bel[i]^ans)>ans){
              ans^=bel[i];
          }
    }
    inline void dfs(int x,li res){
        d[x]=res;
        vis[x]=1;
        for(int i=0;i<v[x].size();i++){
          int y=v[x][i].fi;
          li z=v[x][i].se;
          if(!vis[y])dfs(y,res^z);
            else ins(res^z^d[y]);
        }
    }
    int main(){
        int i,j,k;
        scanf("%d%d",&n,&m);
        for(i=1;i<=m;i++){
          int x,y;
          li z;
          scanf("%d%d%lld",&x,&y,&z);
          v[x].pb(mp(y,z));
          v[y].pb(mp(x,z));
        }
        dfs(1,0ll);
        ans=d[n];
        q();
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    小米智能家居接入智能家居平台homeassistant的方法
    我的nodejs 快速入门
    node.js JS对象和JSON字符串之间的转换
    Mac安装搭建sublimeText3开发Nodejs环境
    使用Xcode IDE写node.js
    nodejs中exports与module.exports的区别
    安装pysqlite2
    linux 终端分屏命令
    MQTT学习笔记
    Cache缓存
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/11519626.html
Copyright © 2011-2022 走看看