pku 1308 Is A Tree 搜索 解题报告

来源:互联网 发布:php商城开源 编辑:程序博客网 时间:2024/06/02 04:23

pku 1308 Is A Tree 搜索 解题报告

注意几点就ok:

10 0       //空树就是一棵树;

2、入度为0结点有几个   //not tree

3、存在没有一个结点的入度为0  //not tree

AC代码:

 

#include <stdio.h>

#include <string.h>

#define size 30

#define Min(a, b) (a > b ? b : a)

#define Max(a, b) (a > b ? a : b)

 

int min, max;

int degree[size];

bool visit[size];

int tree[size][size];

bool answer;

 

void init(int x, int y)

{

       degree[y]++;

       visit[x] = visit[y] = true;

       tree[x][y]++;

       min = Min(min, x);

       min = Min(min, y);

       max = Max(max, x);

       max = Max(max, y);

       while (scanf("%d%d", &x, &y))

       {

              if (x == 0 && y == 0)

              {

                     getchar();

                     break;

              }

              min = Min(min, x);

              min = Min(min, y);

              max = Max(max, x);

              max = Max(max, y);

              degree[y]++;

              visit[x] = visit[y] = true;

              tree[x][y]++;

              if (tree[x][y] > 1)

              {

                     answer = true;

              }

       }

}

 

int dfs(int Target, int p)

{

       int i, sum = 0;

       if (p == Target)

       {

              return 1;

       }

       for (i = min; i <= max; i++)

       {

              if (tree[p][i])

              {

                     sum += dfs(Target, i);

              }

       }

       return sum;

}

 

int main()

{

       int i, x, y, test = 1, start, time;

       while (scanf("%d%d", &x, &y))

       {

              if (x == -1 && y == -1)

              {

                     break;

              }    

              if (x == 0 && y == 0)

              {

                     //这里很诡异,空树是一棵树,晕晕~~~~

                     printf("Case %d is a tree./n", test++);

                     memset(tree, 0, sizeof(tree));

                     memset(degree, 0, sizeof(degree));

                     memset(visit, false, sizeof(visit));

                     getchar();

                     continue;

              }

              answer = false;

              min = 100; max = 0;

              init(x, y);

              start = 0; time = 0;

              for (i = min; i <= max; i++)

              {

                     //degree[i]标记入度,如果所有的结点入度都不是0的话,那么就是not tree

                     if (degree[i] == 0 && visit[i])

                     {

                            start = i;

                            time++;    //记录有几棵树,2棵以上,那么就是not tree

                     }

              }

              if ((start == 0 || time > 1) || answer)  

              {

                     printf("Case %d is not a tree./n", test++);

                     memset(tree, 0, sizeof(tree));

                     memset(degree, 0, sizeof(degree));

                     memset(visit, false, sizeof(visit));

                     continue;

              }

              answer = false;

              for (i = min; i <= max; i++)

              {

                     if (i != start && degree[i] >= 1)

                     {    

                            //搜索判断有几条路径,不是唯一的,那么not tree

                            if (dfs(i, start) > 1)

                            {

                                   answer = true;

                                   break;

                            }

                     }

              }

              if (answer)

              {

                     printf("Case %d is not a tree./n", test++);

              }

              else

              {

                     printf("Case %d is a tree./n", test++);

              }

              memset(tree, 0, sizeof(tree));

              memset(degree, 0, sizeof(degree));

              memset(visit, false, sizeof(visit));

       }

       return 0;

}

 

 

原创粉丝点击