现在的位置: 首页 > 综合 > 正文

hdu1325Is It A Tree?

2013年10月07日 ⁄ 综合 ⁄ 共 1628字 ⁄ 字号 评论关闭

题意:能否构成一棵树。。怎么感觉像图论的知识,放在字符串专题里。

<code>

#include<stdio.h>
#include<iostream>
#include<string.h>
#define pr  printf
using namespace std;
int main()
{
   
    int i,j,k,m,n,T,ca,E,V,indeg,zero,root;
    int num,a[2][20],s,t,p,q;
    int D[20][20],degin[20],degout[20],have[20];
    ca=0;
    while(1)
    {
       for(i=1;i<20;i++)
       {
         degin[i]=degout[i]=0;//入度、出度
         have[i]=0;
         for(j=1;j<20;j++)
           D[i][j]=0;//i->j的边
       }
       scanf("%d%d",&i,&j);
       if(i<0&&j<0)break;
       ca++;E=0;V=0;//E边的条数,V点的个数
       while(1)
       {
          if(i==0&&j==0)break;
          E++;
          D[i][j]=1;
          degout[i]++;
          degin[j]++;
          if(have[i]==0)V++;//点个数
          if(have[j]==0)V++;
          have[i]=1;
          have[j]=1;
          scanf("%d%d",&i,&j);
      }
      if(E==0){pr("Case %d is a tree./n",ca); continue;}
      if(E!=V-1){pr("Case %d is not a tree./n",ca); continue;}
      zero=0;indeg=0; root=0;
      for(i=1;i<20;i++)
      {
         if(have[i])
         {
            if(degin[i]==0){zero++;root=i;}//找根结点
            if(degin[i]>1)indeg=2;// 不止一个指向i点,不是树
           //pr("i=%d in=%d out=%d/n",i,degin[i],degout[i]);
         }
      }
      if(zero!=1||indeg==2){pr("Case %d is not a tree./n",ca); continue;}
      num=1;
      a[0][1]=root;
      s=0;
      p=0;q=1;t=1;
      while(1)
      {
         p=0;
         for(i=1;i<=q;i++)
         {
            for(j=1;j<20;j++)
           {
              if(D[a[s][i]][j]==1){p++;a[t][p]=j;}
           }
         }
         if(p==0)break;//所有都是叶子了
         q=p;//
         num+=p; //记录加入这棵树的点个数
         s=1-s;t=1-t;
      }
      if(num==V){pr("Case %d is a tree./n",ca); continue;}
      else        {pr("Case %d is not a tree./n",ca); continue;}
    }
    return 0;
}

抱歉!评论已关闭.