加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

[bzoj2115]Xor

发布时间:2020-12-16 10:46:34 所属栏目:百科 来源:网络整理
导读:任选一条路径,考虑如果从一个点向另外一个方向走,该方向上一定有一个环(否则来去无意义),所以相当于一条路径+许多的环异或最大值,可以用线性基来求 1 #includebits/stdc++.h 2 using namespace std; 3 #define N 100005 4 #define ll long long 5 stru

任选一条路径,考虑如果从一个点向另外一个方向走,该方向上一定有一个环(否则来去无意义),所以相当于一条路径+许多的环异或最大值,可以用线性基来求

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 100005
 4 #define ll long long
 5 struct ji{
 6     int nex,to;
 7     ll len;
 8 }edge[N<<2];
 9 int E,n,m,x,y,head[N],vis[N];
10 ll z,a[61],s[N];
11 void add(int x,int y,ll z){
12     edge[E].nex=head[x];
13     edge[E].to=y;
14     edge[E].len=z;
15     head[x]=E++;
16 }
17 void add(ll k){
18     for(int i=60;i>=0;i--)
19         if (k&(1LL<<i))
20             if (a[i])k^=a[i];
21             else{
22                 a[i]=k;
23                 break;
24             }
25 }
26 void dfs(int k,int fa,ll sh){
27     s[k]=sh;
28     vis[k]=1;
29     for(int i=head[k];i!=-1;i=edge[i].nex)
30         if (i!=fa)
31             if (!vis[edge[i].to])dfs(edge[i].to,i^1,s[k]^edge[i].len);
32             else add(s[k]^s[edge[i].to]^edge[i].len);
33 }
34 ll query(ll k){
35     for(int j=60;j>=0;j--)
36         if ((k&(1LL<<j))==0)k^=a[j];
37     return k;
38 }
39 int main(){
40     scanf("%d%d",&n,&m);
41     memset(head,-1,sizeof(head));
42     for(int i=1;i<=m;i++){
43         scanf("%d%d%lld",&x,&y,&z);
44         add(x,z);
45         add(y,z);
46     }
47     dfs(1,0);
48     printf("%lld",query(s[n]));
49 }
View Code

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读