首页 > 代码库 > poj 1308 Is It A Tree?
poj 1308 Is It A Tree?
树 除了空树外,有且仅有一个根结点,且除根结点外,其余结点有且仅有一个前驱
判断图是否为树,则需判断它们的公共祖先是否仅有一个,且入度都小于2,并且不能形成环
链接:poj 1308
#include<stdio.h> #define N 100000 int f[N+10],t[N+10],c[N+10]; int find(int a) { if(a!=f[a]) f[a]=find(f[a]); return f[a]; } int mix(int a,int b) { int x,y; x=find(a); y=find(b); if(x==y) return 0; f[x]=y; return 1; } int main() { int i,j=0,n,m,a,b,flag; while(scanf("%d%d",&m,&n)!=EOF){ if(m<0&&n<0) //当输入两个负数时结束 break; j++; if(m==0&&n==0){ printf("Case %d is a tree.\n",j); continue; } for(i=1;i<=N;i++){ f[i]=i; c[i]=t[i]=0; } flag=1; while(m!=0&&n!=0){ t[m]=t[n]=1; c[n]++; //计算入度 if(c[n]>1) flag=0; a=mix(m,n); //判断是否会形成环 if(!a) flag=0; scanf("%d%d",&m,&n); } if(flag){ b=0; for(i=1;i<=N;i++){ if(t[i]&&f[i]==i) b++; //计算根结点数目 if(b>1) break; } } if(flag&&b==1) printf("Case %d is a tree.\n",j); else printf("Case %d is not a tree.\n",j); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。