地址:http://acm.bit.edu.cn/mod/programming/view.php?id=711
给出一个有向图的边,问该图是不是有向树
标程貌似是并查集,但是其实只要满足所有点的入度均为1,只有一个(根节点)为0就可以了。我做的时候还加上了边数=节点数-1这个条件,但其实这是前述条件的推论。。。
另外注意 空树即0 0也是树。。
#include<iostream>
using namespace std;
int rudu[1005]; //节点入度
bool flag[1005];
int edge,node0; //边数 点数
void init()
{
memset(flag,0,sizeof(flag));
memset(rudu,0,sizeof(rudu));
edge=node0=0;
}
int main()
{
int T1,T2,case0=1;
init();
while(scanf("%d%d",&T1,&T2))
{
if(T1==-1&&T2==-1) return 0;
if(!T1&&!T2)
{
int flag1=0;
for(int i=1;i<1005;i++)
{
if(flag[i])
{
if(rudu[i]==0) flag1++;
else if(rudu[i]>1)
{
flag1=0;
break;
}
}
}
if(node0==0||(flag1==1&&node0-1==edge)) printf("Case %d is a tree.\n",case0++); //若树为空 或 只有一个0入度点其他均为1入度点且边数=节点数-1
else printf("Case %d is not a tree.\n",case0++);
init();
continue;
}
rudu[T2]++,edge++;
if(!flag[T1]) node0++,flag[T1]=1;
if(!flag[T2]) node0++,flag[T2]=1;
}
return 0;
}