70 pts,但是都是比较小的点,希望好心大佬帮帮忙。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e4 + 5, M = 1e5 + 5;
bool f1;
int n, m, fir[N], nxt[N << 1], son[N << 1], w[N << 1], x, y, z, tot = 1, fa[N], dis[N], fax, fay, idx;
struct edge{
int u, v, w;
}e[M];
struct LB{
int a[105];
inline void insert(int x){
x ^= dis[n];
for(int i = 60; ~i; i--){
if(x >> i & 1){
if(!a[i]){
a[i] = x;
return ;
}
x ^= a[i];
}
}
}
inline int query(){
int res = 0;
for(int i = 60; ~i; i--){
if(res >> i & 1) continue ;
res ^= a[i];
}
return res;
}
}X;
bool f2;
inline void add(int x, int y, int z){
nxt[++tot] = fir[x];
fir[x] = tot;
son[tot] = y;
w[tot] = z;
}
inline void dfs(int x, int ff = 0){
for(int i = fir[x]; i ; i= nxt[i]){
if(son[i] == ff) continue ;
dis[son[i]] = dis[x] ^ w[i];
dfs(son[i], x);
}
}
inline int getdist(int x, int y){
return dis[x] ^ dis[y];
}
inline int getfa(int x){
return fa[x] == x ? x : fa[x] = getfa(fa[x]);
}
signed main(){
// printf("%.2lfMB\n", (&f2 - &f1) / 1024.0 / 1024.0);
scanf("%lld%lld", &n, &m);
for(int i = 1; i <= n; i++) fa[i] = i;
for(int i = 1; i <= m; i++){
scanf("%lld%lld%lld", &x, &y, &z);
fax = getfa(x), fay = getfa(y);
if(fax != fay){
fa[fax] = fay;
add(x, y, z), add(y, x, z);
continue ;
}
e[++idx] = (edge){x, y, z};
}
for(int i = 2; i <= n; i++) dis[i] = -1;
dfs(1);
X.insert(0);
for(int i = 1; i <= idx; i++){
if((~dis[e[i].u]) && (~dis[e[i].v])) X.insert(e[i].w ^ getdist(e[i].u, e[i].v));
}
printf("%lld\n", X.query());
return 0;
}