和欧拉路有关,给的数据可能是回路也可能只是欧拉路。
在写的时候先用了并查集判断是否在一个集合内。(后来发现超时,去除该部分后AC)
思路是在得到每个点的度之后判断是否构成欧拉路 即奇数度的个数cnt是否为0或是2
cnt为0说明从任意一个点都可以,cnt为2说明起点终点在这两点中。其余情况Impossible
之后计算这个点会被经过几次
假设一个点的度为w ,次数 t = (w+1)/2
w=1 时 1 次 ,w=2 时 1 次 w=4 时 2 次
cnt=2:(两个三角形用一根线连接)
根据异或的计算方式 a^a=0 所以需要找出经过奇数次的点进行异或计算
当cnt=0
需要在cnt=2的基础上对每个点遍历,寻找ans与ans^p的最大值
(正方形路径的计算)
#include<bits/stdc++.h>
using namespace std;
int spnum[100001]={0};
int in[100001]={0};
int main()
{
//freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
int t,n,m;
scanf("%d",&t);
{
while (t--)
{
int x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
in[i]=0;
scanf("%d",&spnum[i]);
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
in[x]++;in[y]++;
}
int cnt=0;
for(int i=1;i<=n;i++)
if(in[i]%2)cnt++;
int ans=0,t;
if(cnt!=0&&cnt!=2)printf("Impossible\n");
else
{
for(int i=1;i<=n;i++)
{
if((in[i]+1)/2%2)ans=ans^spnum[i];
}
if(cnt==0)
{
t=ans;
for(int i=1;i<=n;i++)
{
ans=max(ans,t^spnum[i]);
}
}
printf("%d\n",ans);
}
}
}
return 0;
}