#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1e5+7;
int n,m;
int val[N];
int deg[N];
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(deg,0,sizeof(deg));
for(int i=1;i<=n;i++)
{
scanf("%d",&val[i]);
}
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
deg[u]++;
deg[v]++;//双向边
}
int cnt=0;
int flag=1;
for(int i=1;i<=n;i++)
{
if(deg[i]%2)
{
cnt++;//奇数度顶点可以是两个 起点和终点
flag=0;
}
}
if((flag||(flag==0&&cnt==2)))
{
int res=0;
for(int i=1;i<=n;i++)
{
res^=val[i];
}
int Max=-1;
if(cnt==0)
{
for(int i=1;i<=n;i++)//度数都为偶数时 枚举起点即可 a0....a0 异或满足交换律
{
Max=max(Max,res^val[i]);//度数为偶数的起点也是终点
}
}
else
{
int res=0;
for(int i=1;i<=n;i++)
{
int num=(deg[i]+1)/2;//经过该点几次
if(num%2)
{
res^=val[i];
}
}
Max=res;
}
cout<<Max<<endl;
}
else
{
cout<<"Impossible"<<endl;
}
}
return 0;
}
hdu 5883 欧拉路
最新推荐文章于 2020-11-25 20:40:43 发布