hdu 1325 Is It A Tree?

题目分析:给定很多边,判断是否为树,,,,

                  1.有且仅有一个根节点,每个节点的入度不大于1(开始没考虑到这点,一直wa)。

                  2.无圈

                   2.0 0 是棵空树

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

struct node{
     int v;
	 bool  flag;
	 int indegree;
}parent[100100];
int find(int x)
{
	int i;
	for(i=x;i!=parent[i].v;i=parent[i].v);
	while(x!=i)
	{
		int temp=parent[x].v;
		parent[x].v=i;
        x=temp;
	}
	return i;
}
int main()
{
	int x,y,num=0,c=0;
	bool flag=true;
	for(int i=1;i<=100000;i++)
	{
		parent[i].v=i;
		parent[i].flag=false;
		parent[i].indegree=0;
	}
	while(scanf("%d %d",&x,&y)!=EOF)
	{
		if(x+y==-2)
			break;
		if(x==0&&y==0)
		{
			c++;
			for(int i=1;i<=100000;i++)
			{
				if(parent[i].flag!=0 && parent[i].v==i)
				    num++;
			}
			if(flag==true && (num==1||num==0) )
				printf("Case %d is a tree.\n",c);
			else
				printf("Case %d is not a tree.\n",c);
           //printf("%d***\n",flag);
			for(int i=1;i<=100000;i++)
			{
				parent[i].v=i;
				parent[i].flag=false;
				parent[i].indegree=0;
			}
			num=0;
			flag=true;
		}
		else
		{
			parent[x].flag=true;
			parent[y].flag=true;
			if(parent[y].indegree>=1)
				flag=false;
			else
				parent[y].indegree=1;
			int fx=find(x);
			int fy=find(y);
			if(fx==fy)
				flag=false;
			else if(fx<fy)
				parent[fy].v=fx;
			else
				parent[fx].v=fy;
		}
	}
	//system("pause");
	return 0;
}


你可能感兴趣的:(hdu 1325 Is It A Tree?)