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

 

你可能感兴趣的:(问题)