题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5883
思路:
欧拉路的性质:经过每条边一次且仅一次,奇度定点个数为0(欧拉回路)或2(欧拉路)。
度数为x的顶点,贡献为(x+1)/2%2,首先当然需要先判断是否存在欧拉路,再分是否为欧拉回路两种情况讨论。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 5;
int a[N], deg[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,ans = 0;
memset(deg,0,sizeof(deg));
scanf("%d %d",&n,&m);
for(int i = 1; i <= n; i++)
scanf("%d", a+i);
while(m--)
{
int u,v;
scanf("%d %d",&u,&v);
deg[u]++,deg[v]++;
}
int flag = 1, num = 0;
for(int i = 1; i <= n; i++)
{
if(!deg[i])
flag = 0;
if(deg[i] & 1)
num++;
if(((deg[i] + 1) >> 1) & 1)
ans ^= a[i];
}
if(!flag || num != 0 && num != 2)
{
printf("Impossible\n");
continue;
}
if(num == 2)
{
printf("%d\n",ans);
continue;
}
for(int i = 1; i <= n; i++)
ans = max(ans,ans^a[i]);
printf("%d\n",ans);
}
return 0;
}
本文介绍了一道经典的图论问题——欧拉路径问题,并通过一个具体的题目(HDU 5883)进行解析。文章详细阐述了如何判断一条欧拉路径的存在性,以及在存在欧拉路径的情况下,如何计算特定的贡献值。通过代码实现展示了整个求解过程。
1368

被折叠的 条评论
为什么被折叠?



