NYOJ 42 一笔画问题

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 int father[1005];
 5 int degree[1005];
 6 int find(int x)
 7 {
 8     if(x!=father[x])
 9         father[x]=find(father[x]);
10     return father[x];
11 }
12 void merge(int x,int y)
13 {
14     x=find(x);
15     y=find(y);
16     if(x!=y)
17         father[x]=y;
18 }
19 int main()
20 {
21     int i,a,b,n,p,q,cnt,dnt; 
22     scanf("%d",&n);
23     while(n--){
24         cnt=dnt=0;
25         memset(degree,0,sizeof(degree));
26         scanf("%d%d",&p,&q);
27         for(i=1;i<=p;i++)
28             father[i]=i;
29         while(q--){
30             scanf("%d%d",&a,&b);
31             if(a==b) continue;
32             degree[a]++;
33             degree[b]++;
34             merge(a,b);
35         }
36         for(i=1;i<=p;i++){
37             if(father[i]==i)
38                 cnt++;
39             if(degree[i]&1)
40                 dnt++;
41         }
42         if(cnt==1&&(dnt==0||dnt==2))
43             puts("Yes");
44         else
45             puts("No");
46     }
47     //system("pause");
48     return 0;
49 }

解题思路: 

在18世纪的哥尼斯堡城里有七座桥。当时 有很多人想要一次走遍七座桥,并且每座桥只能经过一次。这就是世界上很有名的哥尼斯堡七桥问题。你能一次走遍这七座桥,而又不重复吗?(自己动手画画吧)

答案

  16.一笔画问题

  这个问题,实际上是一笔画问题。

  一笔画就是一笔可以画成一个图。

  判断一笔画的方法:

  ①是连通的。一个图,如果图上任意二点总有线段连接着,就称为连通的。不是连通的就不能一笔画出。

  ②奇点个数是0或者是2。图上线段的端点可以分成二类,奇点和偶数。一个点,以它为端点的线段数是奇数就称为奇点,线段数是偶数就称为偶点。

  一个图是否是一笔画就看奇点的个数,奇点个数是 0 或者 2,就是一笔画,否则就不是一笔画。

  哥尼斯桥问题,就是一笔画问题。但因A、B、C、D四个点都是奇点即奇点的个数是4,而不是0或2,所以不是一笔画,也就不能一次走遍,而又不重复。

今天又复习了一遍并查集的概念,参见:http://www.nocow.cn/index.php/%E5%B9%B6%E6%9F%A5%E9%9B%86

 

posted on 2013-03-19 14:59  小花熊  阅读(919)  评论(0编辑  收藏  举报

导航