【bzoj2115】【Wc2011】Xor

Description

Input

第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目。 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边。 图中可能有重边或自环。

Output

仅包含一个整数,表示最大的XOR和(十进制结果) 。

Sample Input

5 7
1 2 2
1 3 2
2 4 1
2 5 1
4 5 3
5 3 4
4 3 2

Sample Output

6

HINT

题解:膜拜题解:http://hzwer.com/5505.html

代码:

#include<iostream>
#include<cstdio>
#define N 50010
#define M 100010
using namespace std;
int n,m,x,y,cnt=1,point[N],next[M*2];
struct use{int en;long long v;}e[M*2];
long long ans,f[N],v,ins[70],q[N*100];
bool vis[N];
void add(int x,int y,long long v){
   next[++cnt]=point[x];point[x]=cnt;e[cnt].en=y;e[cnt].v=v;
}
void dfs(int x,int pre){
  vis[x]=1;
  for (int i=point[x];i;i=next[i])
   if (i!=pre){
     if (!vis[e[i].en]){f[e[i].en]=f[x]^e[i].v;dfs(e[i].en,i^1);}
     else {q[++q[0]]=f[x]^f[e[i].en]^e[i].v;}
  }
}
int main(){
   scanf("%d%d",&n,&m);
   for (int i=1;i<=m;i++){scanf("%d%d%lld",&x,&y,&v);add(x,y,v);add(y,x,v);}
   dfs(1,2);ans=f[n];
   for (int i=1;i<=q[0];i++)
     for (int j=62;~j;j--){
        if ((q[i]>>j)&1){if (!ins[j]){ins[j]=q[i];break;}q[i]^=ins[j];}
     }
   for (int i=62;i>=0;i--) if (ins[i]&&!((ans>>i)&1)) ans^=ins[i];
   cout<<ans<<endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值