pku 1308 Is A Tree 搜索 解题报告
注意几点就ok:
1、0 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;
}