您的位置:首页 > 其它

hdu 1325 is it a tree?

2014-08-19 11:32 344 查看
这道题在poj上可以很容易过,而hdu却过不了。应该属于 poj 数据弱的原因吧。

笔者之前做了 hdu 1272, 是一道判断无向树的问题,如果你用这个代码去交poj,应该是能过的。

但是无向树和有向树是有区别的, 有向树要求整个树中只有一个入度为 0 的结点,其他节点入度只能为1,而无向树中没有入出度的概念。

例如:1 2 3 2 0 0 有向图中九不是树了。

解决了这个问题这道题应该就简单了(多出一个数组来存每个顶点的入度就行了)。

这道题比较坑的还有结束条件,把 -1 -1 结束 改成 有一个小于0就结束吧。

#include<stdio.h>
#include<string.h>

int node[100008];
bool peak[100008];
int in[100008];
int peak_num;
int edge;
int mcount;

void initial(int n){

   mcount = 0;
   for(int i= 1;i <= n; i++){
     node[i] = i;
   }

}

int mfind(int p){

   while( p != node[p]){
     node[p] = node[node[p]];
     p = node[p];
   }
   return p;

}

int uni(int p, int q){

   int pi = mfind(p);
   int qi = mfind(q);

   if( pi == qi ){
     return 0;
   }

      peak[p] = true;
      peak[q] = true;
      in[q] ++;
      edge ++;

      node[qi] = node[pi];

   return 1;
}

int main(){

  int a, b;
  int k = 1;
  while(~scanf("%d %d", &a, &b)){

    edge = 0;
    int flag = 0;
    peak_num = 0;
    initial(100000);
    memset(peak, 0, sizeof(peak));
    memset(in, 0, sizeof(in));
    if(a < 0 || b < 0)
        break;
    if( a == 0 && b == 0){
        printf("Case %d is a tree.\n", k++);
        continue;
    }
    if(!uni(a, b) && a != b)
       flag = 1;

    while(~scanf("%d %d", &a, &b)){
        if(a == 0 && b == 0)
            break;
        if(!uni(a, b) && a != b)
           flag = 1;

    }
    for(int i= 1; i <= 100000; i++){
        if(peak[i]){
         peak_num ++;
         if(node[i] == i)
            mcount ++;
        }
        int zero_num = 0;
        if(in[i] == 0)
            zero_num++;

        if(in[i] > 1 || zero_num > 1){
            flag = 1;
        }
    }
    if(mcount != 1){
        flag = 1;
    }
    if(peak_num - edge != 1){
        flag = 1;
    }
    if(flag)
        printf("Case %d is not a tree.\n", k++);
    else
        printf("Case %d is a tree.\n",k++);
  }

  return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: