/*
IS IT A tree
注意: 本代码只能针对是一个连通分量的图判断是否为树 !!!!!!!
*/
#include<stdio.h>
#include<string.h>
#define M 50
int Locate(int data[], int i, int x) ; //函数声明
int main()
{
freopen("tree.in", "r", stdin);
// freopen("estdout.pc2", "w", stdout);
int data[M]={0}, prior[M]={0}; //data存数据,prior[i]统计data[i]前驱个数
int T=0, a,b, i=0, k, count0=0, yes; //T统计输入数据组数, count0统计前驱为0的结点个数。
while(scanf("%d %d", &a,&b)==2)
{
if(a==-1&&b==-1) break; //结束全部输入
if(a!=0&&b!=0) //如果不是某组数据的结束标志,则存数据、统计前驱
{
if( Locate(data,i,a)==-1 ) //若a没有存过,则存储
data[i++]=a;
k=Locate(data,i,b); //在data数组中找b. 其位置下标给k
if(k==-1) { //k为-1,说明b没有存过,则将其存入
data[i++]=b;
prior[i-1]++; //让b的前驱个数增加
}
else prior[k]++; //b已经存在data[k]中,直接让b的前驱个数增加
}
else { //一组信息存储完毕, 共i个结点,各结点前驱个数已经统计完毕 ,
//分析各结点前驱个数
T++; //统计组数
for(k=0; k<i; k++)
{
//printf("%d, p[%d]=%d\n", data[k], k, prior[k]); //测试用
if(prior[k]>1) { //发现有结点前驱个数大于1,则不是树
yes=0;
break;
}
if(prior[k]==0) count0++; //统计前驱为0的结点个数
}
if(!yes||count0!=1) //树中只有一个结点(根)的前驱数为0
printf("Case %d is not a tree.\n", T);
else
printf("Case %d is a tree.\n", T);
i=0; count0=0; // 准备接收新的一组数据,data数组下标归0,计数器清0,
memset(data, 0, sizeof(data)); //将data数组中的数全部置0 ,此处也可以不写
memset(prior, 0, sizeof(prior)); //将Prior数组中的计数器全部置0
}
}
return 0;
}
//在数组data的前i个数中,判断是否有x,
// 若有则返回下标位置, 若无则返回-1
int Locate(int data[], int i, int x)
{
int n;
for(n=0; n<i; n++)
if(data[n]==x) return n;
return -1;
}
IS IT A tree
最新推荐文章于 2019-08-19 10:44:14 发布