题意: 就是输入 一堆的边,完了让你判断下这写边连起来是不是一个树 。
里面有个坑点就是他可能会给你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 ;
}
}
}