并查集专题 N - Is It A Tree?(水题)

题意: 就是输入 一堆的边,完了让你判断下这写边连起来是不是一个树 。
里面有个坑点就是他可能会给你2个不连通的图(这个时候就要判断是不是一个树了)
代码:
C++提交WA了,,,G++就AC。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std ;
int pre[100000] ;
int arr[100000] ;
//int vis[100000] ;

int find(int x)
{
    int r=x;
    while(pre[r]!=r)
    r=pre[r];//找到他的前导结点
   int i=x,j;
    while(i!=r)//路径压缩算法
    {
        j=pre[i];//记录x的前导结点
        pre[i]=r;//将i的前导结点设置为r根节点
        i=j;
    }

    return r;
}

  void init(int n){
   for(int i = 0 ; i <= n ; i++)
    pre[i] = i ;
  }
int main(){
   int n , m ;
   int key = 0 ;
   int k = 1 ;
   init(100000) ;
   while(cin >> n >>m){
    if(m + n == -2) break ;
    else if(n + m == 0) {
            int cnt = 0 ;
     for(int i = 1 ; i <= 100000 ; i++)
     {
          if(arr[i] != 0 && pre[i] == i  ) { cnt++ ; if(cnt >=2) break ;}
     }
    if(key == 1 || cnt >= 2) printf("Case %d is not a tree.\n",k++);
    else printf("Case %d is a tree.\n",k++) ;
       key = 0 ;
     init(100000);
     memset(arr , 0 , sizeof(arr)) ;
     }
    else {
        arr[n] =  arr[m] = 1 ;
        int r = find(n) ;
        int l = find(m) ;
        if(r != l) pre[r] = l ;
        else key = 1 ;
    }
   }
}

猜你喜欢

转载自blog.csdn.net/qq_42894605/article/details/81671736