0
点赞
收藏
分享

微信扫一扫

POJ 1308 Is It A Tree? && NYOJ 129 (树的判定+并查集)


题目链接】​​click here~~​​

题目大意】给定多对节点,判断所有节点能否组成一棵树

解题思路】并查集的基本操作,定义node,edge,统计node和edge的数目,如果(edge==node-1||node==0)则可以成树

树的判定:n个节点,最多n-1条环,只有一个入度为边,不成0 的点,其他入度不大于1,不过要注意poj数据里如果1 1 0 0也会不符合要求,也就是不能自己指向自己

代码:

/*
Author:HRW
树的判定:
n个节点,最多n-1条边
不成环
只有一个入度为0 的点
其他入度不大于1
*/
//#include <bits/stdc++.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=100005;
int father[N],sum[N],a,b,node,edge,vis[N],flag;
int find(int x){if(x==father[x]) return x; return father[x]=find(father[x]); }
void Union(int a,int b){
if(!vis[a]) node++,vis[a]=true;
if(!vis[b]) node++,vis[b]=true;
int pa=find(a);
int pb=find(b);
if(pa!=pb)
{
father[pa]=pb;
edge++;
}
else flag=true;
}
void init(){
node=edge=0;
flag=false;
memset(vis,false,sizeof(vis));
for(int i=1; i<N; i++) father[i]=i;//father数组初始化
}
int main()
{
int a,b,tot=1;
init();
while(scanf("%d%d",&a,&b)&&a!=-1&&b!=-1){
if(a==0&&b==0){
printf("Case %d %s\n",tot++,(!flag&&(edge==node-1||node==0))?"is a tree.":"is not a tree.");
init();
continue;
}
Union(a,b);
}
return 0;
}



举报

相关推荐

0 条评论