标签:异或 mission rip next element output pat bsp style
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 2104 Accepted Submission(s): 841
解析 先判断图是否只有一个连通块 然后判断是否存在欧拉回路或者路径 欧拉路径每个点经过 (度数+1)/2 次 欧拉回路也一样 但是起点多走一次 每个点都可以作为起点
所以直接枚举取最大值就好了。
AC代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+10; 4 int a[maxn],du[maxn],par[maxn]; 5 int _find(int x) 6 { 7 return x==par[x]?x:par[x]=_find(par[x]); 8 } 9 void unio(int a,int b) 10 { 11 int ra=_find(a); 12 int rb=_find(b); 13 if(ra!=rb) par[rb]=ra; 14 } 15 int main() 16 { 17 int t; 18 scanf("%d",&t); 19 while(t--) 20 { 21 int n,m; 22 scanf("%d%d",&n,&m); 23 for(int i=1;i<=n;i++) 24 { 25 par[i]=i;du[i]=0; 26 scanf("%d",&a[i]); 27 } 28 for(int i=0;i<m;i++) 29 { 30 int u,v; 31 scanf("%d%d",&u,&v); 32 unio(u,v); 33 du[u]++,du[v]++; 34 } 35 int sum=0,flag=0; 36 for(int i=1;i<=n;i++) 37 { 38 if(du[i]&1)sum++; 39 if(i!=1&&par[i]!=par[i-1])flag=1; 40 } 41 if(sum>2||flag) 42 printf("Impossible\n"); 43 else 44 { 45 int ans=0; 46 for(int i=1;i<=n;i++) 47 { 48 int temp=(du[i]+1)/2; 49 while(temp) 50 ans=ans^a[i],temp--; 51 } 52 if(sum==0) 53 { 54 int temp=ans; 55 for(int i=1;i<=n;i++) 56 ans=max(temp^a[i],ans); 57 } 58 printf("%d\n",ans); 59 } 60 } 61 }
标签:异或 mission rip next element output pat bsp style
原文地址:https://www.cnblogs.com/stranger-/p/9383171.html