HDU - 5883

题目链接:HDU - 5883


答案显然就是任意一个欧拉通路。

首先考虑连通性。

然后我们可以分度为奇数的个数,大于2显然无解。如果为0,那么任意选一个起点。如果为2,那么则是一定是路径。

然后对每个点看贡献,看度除以2的奇偶性即可,因为出去一次进来一次,特判起点。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int n,m,deg[N],a[N],ok,cnt,s,res,vis[N];
vector<int> g[N];
void dfs(int x){
	vis[x]=1;
	for(int to:g[x]) if(!vis[to]) dfs(to);
}
void solve(){
	scanf("%d %d",&n,&m); s=cnt=res=0; ok=1;
	for(int i=1;i<=n;i++)	scanf("%d",&a[i]),g[i].clear(),deg[i]=vis[i]=0;
	for(int i=1,a,b;i<=m;i++) 
		scanf("%d %d",&a,&b),g[a].push_back(b),g[b].push_back(a),deg[a]++,deg[b]++;
	for(int i=1;i<=n;i++)	if(!vis[i])	dfs(i),cnt++;
	if(cnt!=1)	return puts("Impossible"),void(); cnt=0;
	for(int i=1;i<=n;i++) if(deg[i]&1) cnt++;	
	if(cnt>2)	return puts("Impossible"),void();
	if(!cnt){
		for(int i=1;i<=n;i++) if((deg[i]/2)&1) s^=a[i];
		for(int i=1;i<=n;i++) res=max(res,s^a[i]);
		return printf("%d\n",res),void();
	}
	if(cnt==2){
		for(int i=1;i<=n;i++) if(deg[i]%2==0&&((deg[i]+1)/2)&1) s^=a[i];
		for(int i=1;i<=n;i++) if(deg[i]%2==1&&((deg[i]+1)/2)%2==1) s^=a[i];
		printf("%d\n",s);
	}
}
signed main(){
	int T; cin>>T; while(T--) solve();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/107798627
hdu