首页 > 代码库 > hdu_5883_The Best Path(欧拉路)

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

 

hdu_5883_The Best Path(欧拉路)