UVa 10596 Moring Walk【欧拉回路】

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

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

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

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

比如说 给出的路有这些

0 1

1 2

2 3

3 0

4 4

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

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

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

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring>  
 4 #include<algorithm>  
 5 using namespace std;
 6 int d[10010],pre[10010];
 7 int find(int root){ return root == pre[root] ? root : pre[root] = find(pre[root]); }
 8 void unionroot(int x,int y)
 9 {
10     int root1=find(x);
11     int root2=find(y);
12     if(root1!=root2) pre[root1]=root2;
13 }
14 
15 int main()
16 {
17     int m,n,u,v,i;
18     while(scanf("%d %d",&n,&m)!=EOF)
19     {
20             int flag=1;
21         memset(d,0,sizeof(d));
22         memset(pre,0,sizeof(pre));
23         for(i=0;i<=10010;i++)
24         pre[i]=i;
25         for(i=1;i<=m;i++)
26         {
27             scanf("%d %d",&u,&v);
28             d[u]++;
29             d[v]++;
30             unionroot(u,v); 
31         }
32         
33         int root=find(0);
34         
35         if(m==0||n==0) flag=0;//n=0的时候是不能构成回路的,m=0的时候 也不能 
36         
37         for(i=0;i<n;i++){     
38                 if(d[i]!=0){ //判断这个点是否是孤立的点 
39                     if(find(i)!=root||d[i]%2!=0){ //判断这个点是否在同一个联通块上,以及判断这个店的度数是否为偶数 
40                     flag=0;
41                     break;
42                   }
43                 } 
44         }
45         
46         if(flag)
47         printf("Possible\n");
48         else
49         printf("Not Possible\n");     
50     }
51     return 0;
52 }
View Code

 

 

 

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

go---go---

posted @ 2015-03-16 21:09  sequenceaa  阅读(206)  评论(0编辑  收藏  举报