简略题意:在一张图上,从任意位置出发,回到这个位置,走过的路径的亦或和最大是多少。
和BZOJ2115这题基本一致,只是少了一个初值。BZOJ2115
#include <bits/stdc++.h>
#define maxn 110000
#define LL long long
//#define debug
using namespace std;
vector<pair<int, LL>>G[maxn];
vector<LL> ans;
int t, n, m;
LL XOR[maxn];
int vis[maxn];
LL a[64];
void init(){
for(int i=0; i<maxn; i++) G[i].clear();
ans.clear();
memset(XOR, 0, sizeof XOR);
memset(vis, 0, sizeof vis);
memset(a, 0, sizeof a);
}
void dfs(int u, int fa, LL val){
if(vis[u]){
ans.push_back(XOR[u] ^ val);
return ;
}
vis[u] = 1;
for(int i=0; i<G[u].size(); i++){
int v = G[u][i].first;
if(v == fa) continue;
if(!vis[v]) XOR[v] = val ^ G[u][i].second;
dfs(v, u, val^G[u][i].second);
}
}
int f = 0;
int main(){
scanf("%d", &t);
while(t--){
init();
scanf("%d%d", &n, &m);
for(int i=0; i<m; i++){
int u, v; LL w;
scanf("%d%d%lld", &u, &v, &w);
G[u].push_back(make_pair(v, w));
G[v].push_back(make_pair(u, w));
}
dfs(1, -1, 0);
for(auto it : ans) {
for(int j = 61; j >= 0; j--) {
if(it & (1LL << j)) {
if(a[j]) it ^= a[j];
else {
a[j] = it;
break;
}
}
}
}
LL res = 0;
for(int i = 61; i >= 0; i--)
res = max(res, res^a[i]);
printf("Case #%d: %lld\n", ++f, res);
}
return 0;
}