题意:
能不能经过图上的所有边一次且仅一次,如果可以,每次经历一个节点,将节点的权值异或进答案,问答案的最大值
思路:
欧拉图,奇度顶点的个数必须是0个或者两个,先判出是否是欧拉图
如果有两个奇度顶点,一定是从一个奇度顶点到另一个奇度顶点,答案就是两个奇度顶点与所有偶度顶点的度数除2为奇数的点的权值异或,度数除2即为通过这个点的次数
如果没有奇度顶点,可以从任意一个偶度顶点出发,这时这个起点的权值会比不作为起点多经过一次,所以答案就是所有偶度顶点的度数除2为奇数的点的权值异或,再遍历所有点,取与这个点权值异或最大的那个
异或运算的优先级真的好低...至少比大于小于运算符低..傻傻的不知道哪里错了...
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,m;
int num[100010];
int deg[100010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(deg,0,sizeof deg);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
deg[x]++;
deg[y]++;
}
int cnt=0;
for(int i=1;i<=n;i++)
{
if(deg[i]&1)
{
cnt++;
}
}
if(cnt!=0&&cnt!=2)
{
printf("Impossible\n");
}
else
{
int ans=0;
for(int i=1;i<=n;i++)
{
if(deg[i]&1)
{
deg[i]=(deg[i]-1)/2;
if(deg[i]%2==0)
ans^=num[i];
}
else
{
deg[i]/=2;
if(deg[i]&1)
{
ans^=num[i];
}
}
}
if(cnt==2)
printf("%d\n",ans);
else
{
int maxx=0;
for(int i=1;i<=n;i++)
{
maxx=max(maxx,ans^num[i]);
}
printf("%d\n",maxx);
}
}
}
}