poj1308

http://poj.org/problem?id=1308

题目要求是判断是不是为一棵树

主要看是否满足2个条件

共有n个不同的数  也就是n个节点

1 有n-1个入度 去除根节点  一个节点只有一个入度

2 不能有环 就是单方向的

其实只要判断条件1就可以 了 只要是环肯定不会为n-1个入度 所以只判断第一个条件就好

代码如下 用a[]判断节点的入度是否唯一 用K来计算总入度是否为n-1

用b[]来判断n的值为几

这个题还要注意一点 0 0是空树 也是树

View Code
 1 #include <stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     int a[30000] = {0}, i = 0, j, k, flag,x,y,b[30000];
 6     while(scanf("%d%d", &x, &y)!=EOF)
 7     {
 8         k = 0;
 9         j = 0;
10         i++;
11         flag = 1;
12         memset(a, 0, sizeof(a));
13         memset(b,0,sizeof(b)) ;
14         if(x<0&&y<0)
15         break;
16         a[y] = x;
17         k++;
18         j++;
19         b[y] = 1;
20         if(b[x]!=1)
21         {
22             b[x] = 1;
23             j++;
24         }
25         if(x ==0&&y ==0)
26         printf("Case %d is a tree.\n", i);
27         else
28         {
29             while(scanf("%d%d", &x, &y), x!=0&&y!=0)
30             {
31                 if(b[x]!=1)
32                 {
33                     b[x] = 1;
34                     j++;
35                 }
36                 if(b[y]!=1)
37                 {
38                     b[y] = 1;
39                     j++;
40                 }
41                 if(a[y] == 0)
42                 {
43                     a[y] = x;
44                     k++;
45                 }
46                 else
47                 {
48                     flag = 0;
49                 }
50             }
51             if(k == j-1&&flag!=0)
52             printf("Case %d is a tree.\n", i);
53             else
54             printf("Case %d is not a tree.\n", i);
55         }
56     }
57     return 0;
58 }
原文地址:https://www.cnblogs.com/shangyu/p/2576889.html