hdu_5883_The Best Path(欧拉路)

题目链接:hdu_5883_The Best Path

题意:

个点 条无向边的图,找一个欧拉通路/回路使得这个路径所有结点的异或值最大。

题解:

节点 i 的贡献为((du[i] +1/ 2) % 2)* a[i]

如果为欧拉回路,需要枚举一下起点,然后取一下最大

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;i++)
 3 using namespace std;
 4 
 5 const int N=1e5+7;
 6 int t,n,m,du[N],a[N],x,y,ans;
 7 
 8 int T_T(int odd=0,int ans=0)
 9 {
10     F(i,1,n)if(du[i]&1)odd++;
11     if(odd!=0&&odd!=2)return -1;//不存在欧拉路
12     F(i,1,n)
13     {
14         du[i]=(du[i]+1)/2;
15         if(du[i]&1)ans^=a[i];
16     }
17     if(odd==0)F(i,1,n)ans=max(ans,ans^a[i]);//奇度点为0,存在欧拉回路
18     return ans;
19 }
20 
21 int main()
22 {
23     scanf("%d",&t);
24     while(t--)
25     {
26         scanf("%d%d",&n,&m);
27         memset(du,0,sizeof(du));
28         F(i,1,n)scanf("%d",a+i);
29         F(i,1,m)scanf("%d%d",&x,&y),du[x]++,du[y]++;
30         if((ans=T_T())==-1)puts("Impossible");else printf("%d\n",ans);
31     }
32     return 0;
33 }
View Code

 

posted @ 2016-09-23 11:08  bin_gege  阅读(123)  评论(0编辑  收藏  举报