题目大意
有N个点M条边,点有点权。问能否一笔画,如果可以则求路过点的最大异或值。
思路
一笔画需要考虑每个点的度,要么所有的点都是偶数度,或者有两个点的度为奇数(作为起点和终点)。由于异或值满足交换律,起点和终点确定的时候值恒定,所有点都为偶数度时遍历每个点为起终点的情况即可。判断一笔画O(n)+遍历起终点O(n),最坏的情况就O(2n)。
#include<bits/stdc++.h>
using namespace std;
int n,m,odd,ans;
int num[100005],node[100005];
bool flag;
int main(){
int t,a,b;
scanf("%d",&t);
while(t--){
memset(node,0,sizeof(node));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",num+i);
}
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
++node[a];
++node[b];
}
odd=0;
flag=0;
ans=0;
for(int i=1;i<=n;i++){
if(node[i]&1)odd++;
if(odd>2){
flag=1;
break;
}
if(((node[i]+1)/2)&1){
ans=ans^num[i];
}
}
if(flag||odd==1){
printf("Impossible\n");
continue;
}
else if(odd==0){
int dans=ans;
for(int i=1;i<=n;i++){
ans=max(ans,dans|num[i]);
}
}
printf("%d\n",ans);
}
return 0;
}