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