题目传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=5883
官方题解:
判断一下是欧拉回路还是通路就好,如果不是的话就直接impossible
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
const int MAXN=100010;
using namespace std;
int fa[MAXN];
int findfa(int x)
{
if(x==fa[x])
return x;
return fa[x]=findfa(fa[x]);
}
int val[MAXN];
int deg[MAXN];
int main ()
{
int t;
cin>>t;
while(t--)
{
int n,m;
scanf("%d%d",&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);
int fu=findfa(u);
int fv=findfa(v);
fa[fu]=fa[fv];
deg[u]++;
deg[v]++;
}
int si=0;
int flag=1;
int faa=findfa(1);
for(int i=1;i<=n;i++)
{
if(findfa(i)!=faa)
{
flag=0;
break;
}
}
if(!flag)
{
printf("Impossible\n");
continue;
}
for(int i=1;i<=n;i++)
{
si+=deg[i]&1;
}
if(si==0)//欧拉回路
{
int ans=0;
for(int i=1;i<=n;i++)
{
if(deg[i]/2%2==1)
{
ans^=val[i];
}
}
for(int i=1;i<=n;i++)
{
ans=max(ans,ans^val[i]);//枚举每个点作为起点
}
printf("%d\n",ans);
}
else if(si==2)
//欧拉通路
{
int ans=0;
for(int i=1;i<=n;i++)
{
if(deg[i]/2%2==1)
{
ans^=val[i];
}
}
for(int i=1;i<=n;i++)
{
if(deg[i]&1)
{
ans^=val[i];
}
}
printf("%d\n",ans);
}
else
{
printf("Impossible\n");
}
}
return 0;
}