码迷,mamicode.com
首页 > 其他好文 > 详细

Xor HYSBZ - 2115 (线性基)

时间:2017-08-24 23:53:38      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:head   hid   clu   play   lap   nbsp   iba   ==   div   

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\n",ans);
84     }
85     return 0;
86 }
View Code

 

 

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

 

Xor HYSBZ - 2115 (线性基)

标签:head   hid   clu   play   lap   nbsp   iba   ==   div   

原文地址:http://www.cnblogs.com/yijiull/p/7425494.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!