题意:判断“带方向的树”,这道题,基本是参考了网上的代码。。。
思路:并查集
#include<iostream>
using namespace std;
int pre[500];
bool vis[500];
void make_set()//初始化
{
for(int i=0;i<499;i++)
pre[i]=i,vis[i]=0;
}
int find_set(int x)
{
return x==pre[x]?x:(pre[x]=find_set(pre[x]));//查
}
void join(int x,int y)//并
{
int r1,r2;
r1=find_set(x);
r2=find_set(y);
//printf("r1=%d r2=%d\n",r1,r2);
//system("pause");
if(r1!=r2)
pre[r2]=r1;
return;
}
int main()
{
int x,y;
int h=1;
while(scanf("%d %d",&x,&y)!=EOF)
{
if(x==-1&&y==-1) break;
if(x==0&&y==0)//判断空树
{
printf("Case %d is a tree.\n",h++);
continue;
}
make_set();
bool flag=true;
vis[x]=vis[y]=1;
int first=x;
if(x==y) flag=false;
else join(x,y);
while(scanf("%d%d",&x,&y)&&x!=0)
{
vis[x]=1;
vis[y]=1;
if(find_set(x)==find_set(y))
{
//printf("%d %d\n",x,y);
flag=false;//如果两个节点的祖先节点相同,那么再相连的话就应该会出现环了。
//system("pause");
}
else join(x,y);
}
for(int i=0;i<499;i++)//判断根节点不唯一的情况
{
if(vis[i]&&find_set(i)!=find_set(first))
{flag=false;break;}
}
if(flag) printf("Case %d is a tree.\n",h++);
else printf("Case %d is not a tree.\n",h++);
}
return 0;
}