题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5883
思路:
欧拉路的性质:经过每条边一次且仅一次,奇度定点个数为0(欧拉回路)或2(欧拉路)。
度数为x的顶点,贡献为(x+1)/2%2,首先当然需要先判断是否存在欧拉路,再分是否为欧拉回路两种情况讨论。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 5;
int a[N], deg[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,ans = 0;
memset(deg,0,sizeof(deg));
scanf("%d %d",&n,&m);
for(int i = 1; i <= n; i++)
scanf("%d", a+i);
while(m--)
{
int u,v;
scanf("%d %d",&u,&v);
deg[u]++,deg[v]++;
}
int flag = 1, num = 0;
for(int i = 1; i <= n; i++)
{
if(!deg[i])
flag = 0;
if(deg[i] & 1)
num++;
if(((deg[i] + 1) >> 1) & 1)
ans ^= a[i];
}
if(!flag || num != 0 && num != 2)
{
printf("Impossible\n");
continue;
}
if(num == 2)
{
printf("%d\n",ans);
continue;
}
for(int i = 1; i <= n; i++)
ans = max(ans,ans^a[i]);
printf("%d\n",ans);
}
return 0;
}