题目链接: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;
}