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
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;
}