poj 1308 Is It A Tree?

来源:互联网 发布:矩阵分解优化问题 编辑:程序博客网 时间:2024/04/30 18:39

树 除了空树外,有且仅有一个根结点,且除根结点外,其余结点有且仅有一个前驱

判断图是否为树,则需判断它们的公共祖先是否仅有一个,且入度都小于2,并且不能形成环

链接:poj 1308

#include<stdio.h>#define N 1000int 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;}


2 0