本题分为两种情况进行讨论
首先每个点的经过次数都可以通过(度数+1)/2 求得
1 欧拉通路,若形成的图为欧拉通路,则只需要把经过的奇数次的点异或起来,则可以得到答案。
2 欧拉回路,若形成的图为欧拉回路,因为起点不确定,则需要遍历每一个点当作起点,取最大值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=1e5+9;
int A[maxn];
int B[maxn];
int C[maxn];
int main()
{
int T;
cin>>T;
while(T--){
int N,M,temp=0;
cin>>N>>M;
for(int i=1;i<=N;i++){
cin>>A[i];
}
memset(B,0,sizeof B);
int x,y;
for(int i=1;i<=M;i++){
cin>>x>>y;
B[x]++;
B[y]++;
}
int flag=0,count1=0,count2=0; //判断是否是欧拉回路的标志
for(int i=1;i<=N;i++){
if(B[i]%2!=0){
flag++;
}
C[i]=(B[i]+1)/2;
if(C[i]%2)
temp^=A[i];
}
if(flag==0){
int maxsum=0;
for(int i=1;i<=N;i++){
temp^=A[i];
maxsum=max(maxsum,temp);
temp^=A[i];
}
cout<<maxsum<<endl;
}
else if(flag==2){
cout<<temp<<endl;
}
else {
cout<<"Impossible"<<endl;
}
}
return 0;
}