zoukankan      html  css  js  c++  java
  • Xor HYSBZ

    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 i=62;i>=0&&x;i--)if(x&(1LL<<i)){
    13             if(!a[i]){
    14                 a[i]=x;
    15                 break;
    16             }else x^=a[i];
    17         }
    18         return x>0;
    19     }
    20     //最大
    21     ll query_max(ll x){
    22         ll ans=x;
    23         for(int i=62;i>=0;i--){
    24             if((ans^a[i])>ans) ans^=a[i];
    25         }
    26         return ans;
    27     }
    28 };
    29 const int maxv=50010;
    30 const int maxe=100010;
    31 int head[maxv];
    32 int cnt=0;
    33 struct Edge{
    34     int v,nex;
    35     ll w;
    36     Edge(int v=0,ll w=0,int nex=0):v(v),w(w),nex(nex){}
    37 }e[maxe<<1];
    38 void init(){
    39     cnt=0;
    40     memset(head,-1,sizeof(head));
    41 }
    42 void add(int u,int v,ll w){
    43     e[cnt]=Edge(v,w,head[u]);
    44     head[u]=cnt++;
    45     e[cnt]=Edge(u,w,head[v]);
    46     head[v]=cnt++;
    47 }
    48 
    49 LiBase lb;
    50 int n,m;
    51 int dfsk;
    52 ll dis[maxv],pre[maxv];
    53 
    54 void dfs(int u,int id){
    55     pre[u]=++dfsk;
    56     for(int i=head[u];~i;i=e[i].nex){
    57         if(i==(id^1)) continue;
    58         int v=e[i].v;
    59         if(!pre[v]){
    60             dis[v]=e[i].w^dis[u];
    61             dfs(v,i);
    62         }else if(pre[v]<pre[u]) lb.insert_(dis[u]^e[i].w^dis[v]);
    63     }
    64 }
    65 
    66 void get_cir(){
    67     memset(pre,0,sizeof(pre));
    68     memset(dis,0,sizeof(dis));
    69     dfsk=0;
    70     dfs(1,-1);
    71 }
    72 int main(){
    73     while(scanf("%d%d",&n,&m)!=EOF){
    74         ll u,v,w;
    75         init();lb.init();
    76         for(int i=0;i<m;i++){
    77             scanf("%d%d%lld",&u,&v,&w);
    78             if(u!=v) add(u,v,w);
    79             else lb.insert_(w);
    80         }
    81         get_cir();
    82         ll ans=lb.query_max(dis[n]);
    83         printf("%lld
    ",ans);
    84     }
    85     return 0;
    86 }
    View Code

    看了众多dalao的博客终于学会了~

  • 相关阅读:
    HDU 2098 分拆素数和
    HDU 2034 *人见人爱A-B
    HDU 1236 排名(Microsoft_zzt)
    HDU 5702 Solving Order
    HDU 2033 人见人爱A+B
    HDU 2029 Palindromes _easy version
    HDU 2021 发工资咯:)
    HDU 2071 Max Num
    HDU 2039 三角形
    页面使用element-tree
  • 原文地址:https://www.cnblogs.com/yijiull/p/7425494.html
Copyright © 2011-2022 走看看