判断一下是不是欧拉路径
#include<stdio.h>
#include<iostream>
#include<memory.h>
#include<stdlib.h>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<algorithm>
using namespace std;
const int MAXN = 100005;
const int MAXM = 500005;
const int INF = 0x3f3f3f3f;
typedef long long LL;
int T, N, M;
int v[MAXN], cnt[MAXN];
struct Edge{
int b;
int next;
}edge[2 * MAXM];
int len = 1;
int head[MAXN];
void AddEdge(int a, int b)
{
edge[len].b = b;
edge[len].next = head[a];
head[a] = len++;
edge[len].b = a;
edge[len].next = head[b];
head[b] = len++;
cnt[a]++;
cnt[b]++;
}
int flag[MAXN];
int travelCnt = 0;
void Travel(int st)
{
travelCnt++;
flag[st] = 1;
int p = head[st];
while (p)
{
if (!flag[edge[p].b])
{
Travel(edge[p].b);
}
p = edge[p].next;
}
}
int main(void) {
#ifndef ONLINE_JUDGE
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif
int T;
scanf("%d", &T);
{
int i, j, k;
int res;
for (int ca = 1; ca <= T; ca++)
{
scanf("%d%d", &N, &M);
for (i = 1; i <= N; i++)
{
scanf("%d", &v[i]);
}
memset(head, 0, (N + 1) * sizeof(int));
memset(cnt, 0, (N + 1) * sizeof(int));
len = 1;
int a, b;
for (i = 0; i < M; i++)
{
scanf("%d%d", &a, &b);
AddEdge(a, b);
}
int st[2], num = 0;
bool impossible = false;
for (i = 1; i <= N; i++)
{
if (cnt[i] % 2)
{
if (num >= 2)
{
impossible = true;
break;
}
st[num++] = i;
}
}
if (1 == num)
{
impossible = true;
}
else if (0 == num)
{
st[0] = 1;
}
if (!impossible)
{
travelCnt = 0;
memset(flag, 0, (N + 1) * sizeof(int));
Travel(st[0]);
if (travelCnt != N)
{
impossible = true;
}
}
if (!impossible)
{
res = 0;
for (i = 1; i <= N; i++)
{
if (cnt[i] % 2)
{
res ^= (((cnt[i] / 2) + 1) % 2 * v[i]);
}
else
{
res ^= ((cnt[i] / 2) % 2 * v[i]);
}
}
if (0 == num)
{
int max = 0;
for (i = 1; i <= N; i++)
{
if ((res ^ v[i]) > max)
{
max = (res ^ v[i]);
}
}
res = max;
}
}
if (impossible)
{
printf("Impossible\n");
}
else
{
printf("%d\n", res);
}
}
}
return 0;
}