UVa 10596 Moring Walk【欧拉回路】

时间:2023-03-09 04:11:10
UVa  10596 Moring Walk【欧拉回路】

题意:给出n个点,m条路,问能否走完m条路。

自己做的时候= =三下两下用并查集做了交,WA了一发-后来又WA了好几发--(而且也是判断了连通性的啊)

搜了题解= = 发现是这样的:

因为只要求走完所有的路,即为只需要走完已经给出的路,而并没有要求所走得路上含有所有的点,

比如说 给出的路有这些

0 1

1 2

2 3

3 0

4 4

UVa  10596 Moring Walk【欧拉回路】

那么构成的路即为,绕着图中的蓝色线走一圈,即为走完了所有的路,

而4是一个孤立点,也并没有构成路,所以不需要管它

代码中的 if(d[i]!=0)是判断这个点是否是孤立点的

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int d[],pre[];
int find(int root){ return root == pre[root] ? root : pre[root] = find(pre[root]); }
void unionroot(int x,int y)
{
int root1=find(x);
int root2=find(y);
if(root1!=root2) pre[root1]=root2;
} int main()
{
int m,n,u,v,i;
while(scanf("%d %d",&n,&m)!=EOF)
{
int flag=;
memset(d,,sizeof(d));
memset(pre,,sizeof(pre));
for(i=;i<=;i++)
pre[i]=i;
for(i=;i<=m;i++)
{
scanf("%d %d",&u,&v);
d[u]++;
d[v]++;
unionroot(u,v);
} int root=find(); if(m==||n==) flag=;//n=0的时候是不能构成回路的,m=0的时候 也不能 for(i=;i<n;i++){
if(d[i]!=){ //判断这个点是否是孤立的点
if(find(i)!=root||d[i]%!=){ //判断这个点是否在同一个联通块上,以及判断这个店的度数是否为偶数
flag=;
break;
}
}
} if(flag)
printf("Possible\n");
else
printf("Not Possible\n");
}
return ;
}

她只是想走完所有的路,她不想走4

go---go---