题意:能否构成一棵树。。怎么感觉像图论的知识,放在字符串专题里。
<code>
#include<stdio.h>
#include<iostream>
#include<string.h>
#define pr printf
using namespace std;
int main()
{
int i,j,k,m,n,T,ca,E,V,indeg,zero,root;
int num,a[2][20],s,t,p,q;
int D[20][20],degin[20],degout[20],have[20];
ca=0;
while(1)
{
for(i=1;i<20;i++)
{
degin[i]=degout[i]=0;//入度、出度
have[i]=0;
for(j=1;j<20;j++)
D[i][j]=0;//i->j的边
}
scanf("%d%d",&i,&j);
if(i<0&&j<0)break;
ca++;E=0;V=0;//E边的条数,V点的个数
while(1)
{
if(i==0&&j==0)break;
E++;
D[i][j]=1;
degout[i]++;
degin[j]++;
if(have[i]==0)V++;//点个数
if(have[j]==0)V++;
have[i]=1;
have[j]=1;
scanf("%d%d",&i,&j);
}
if(E==0){pr("Case %d is a tree./n",ca); continue;}
if(E!=V-1){pr("Case %d is not a tree./n",ca); continue;}
zero=0;indeg=0; root=0;
for(i=1;i<20;i++)
{
if(have[i])
{
if(degin[i]==0){zero++;root=i;}//找根结点
if(degin[i]>1)indeg=2;// 不止一个指向i点,不是树
//pr("i=%d in=%d out=%d/n",i,degin[i],degout[i]);
}
}
if(zero!=1||indeg==2){pr("Case %d is not a tree./n",ca); continue;}
num=1;
a[0][1]=root;
s=0;
p=0;q=1;t=1;
while(1)
{
p=0;
for(i=1;i<=q;i++)
{
for(j=1;j<20;j++)
{
if(D[a[s][i]][j]==1){p++;a[t][p]=j;}
}
}
if(p==0)break;//所有都是叶子了
q=p;//
num+=p; //记录加入这棵树的点个数
s=1-s;t=1-t;
}
if(num==V){pr("Case %d is a tree./n",ca); continue;}
else {pr("Case %d is not a tree./n",ca); continue;}
}
return 0;
}