HDU - 1325:是判断一个有向图是不是一棵树
POJ - 1308:是判断一个无向图是不是一棵树
判断有向图是否是一个无向树
1.空树也是树
2.无环
3.最多一棵树,无森林
4.每个结点入度最多为1
无向图题目链接:POJ - 1308
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
int f[maxn];
int book[maxn];
int flag=0;
int getf(int u)
{
if(u==f[u])
return u;
else
{
f[u]=getf(f[u]);
return f[u];
}
}
void merge(int u,int v)
{
book[u]=1;
book[v]=1;
int t1=getf(u);
int t2=getf(v);
if(t1!=t2)
{
f[t2]=t1;
}
else
flag=1;
}
int main()
{
int a,b,t=1,i;
while(~scanf("%d%d",&a,&b))
{
flag=0;
memset(book,0,sizeof(book));
if(a==-1&&b==-1)
break;
for(i=0;i<maxn;i++)
f[i]=i;
if(a==0&&b==0)
{
printf("Case %d is a tree.\n",t++);
continue;
}
merge(a,b);
while(~scanf("%d%d",&a,&b))
{
if(a==0&&b==0)
break;
merge(a,b);
}
int sum=0;
for(i=0;i<maxn;i++)
{
if(book[i])
{
if(f[i]==i)
sum++;
}
}
printf("Case %d ",t++);
if(flag==1||sum!=1)
printf("is not a tree.\n");
else
printf("is a tree.\n");
}
}
有向图题目链接: HDU - 1325
#include<stdio.h>
#include<algorithm>
using namespace std;
#include<string.h>
int f[100005];
int main()
{
int a,b,flag,i,j;
int t=1;
while(1)
{
i=0;j=0;flag=0;
memset(f,0,sizeof(f));
while(~scanf("%d%d",&a,&b)&&a&&b)
{
if(a<0||b<0)
return 0;
if(f[b]-1==1)//判断是否有回路
flag=1;
if(f[a]==0)
j++;
if(f[b]==0)
j++;
f[a]=1;f[b]=2;
i++;
}
if(flag==0&&j==i+1)//则点的个数=边的个数加一
printf("Case %d is a tree.\n",t++);
else
printf("Case %d is not a tree.\n",t++);
}
}