题目链接:https://cn.vjudge.net/problem/HDU-5883
题意:给你n个点m条边,然后给你n个点的权重,随后m条边,求能否 找到一条路径 使得经过每条路一次,如果能,则输出这条路径的所有权重的最大亦或和,否则输出Impossible.
解析:先判断是否能找到一条路径,要求经过所有边,并且仅仅经过一次,就是要找一条欧拉回路,或者欧拉通路,判断条件是,是否存在两个奇度顶点或者全是偶度顶点
如果存在两个奇度顶点则说明存在欧拉通路,全是偶度顶点则是欧拉回路,由于有子环,所以,会存在度大于2的顶点存在,则需要把 w=(in_degree[i]+1)/2 , w为奇数时的点 加入亦或结果中。
如果是欧拉回路的话,还需要判断 路径从哪里开始。
#include <cstdio>
#include <iostream>
using namespace std;
const int MAX = 1e6+10;
int a[MAX];
int in_degree[MAX];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n, m, x, y, ans = 0, cntt = 0;
scanf("%d%d",&n,&m);
for (int i = 0; i <= n+2;i++) in_degree[i]=0;
for (int i = 1; i <= n;i++) scanf("%d",&a[i]);
for (int i = 1; i <= m;i++){
scanf("%d%d",&x,&y);
in_degree[x]++;
in_degree[y]++;
}
bool f=false;
for (int i = 1; i <= n;i++){
if(in_degree[i]&1){
cntt++;
}
}
if(cntt!=2&&cntt!=0) f=true;
if(f){
printf("Impossible\n");
}
else{
if(n==1) ans=0;
else{
for(int i = 1; i <= n;i++){
int w=(in_degree[i]+1)/2;
if(w&1)
ans=(ans^a[i]);
}
if(cntt==0){
int maxx=0;
for(int i = 1; i <= n;i++){
maxx=max(ans^a[i],maxx);
}
ans=maxx;
}
}
printf("%d\n",ans);
}
}
return 0;
}