NYOJ 129 树的判定 (并查集)
描述
A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties.
There is exactly one node, called the root, to which no directed edges point.
Every node except the root has exactly one edge pointing to it.
There is a unique sequence of directed edges from the root to each node.
For example, consider the illustrations below, in which nodes are represented by circles and edges are represented by lines with arrowheads. The first two of these are trees, but the last is not.
输入
The input will consist of a sequence of descriptions (test cases) followed by a pair of negative integers. Each test case will consist of a sequence of edge descriptions followed by a pair of zeroes Each edge description will consist of a pair of integers; the first integer identifies the node from which the edge begins, and the second integer identifies the node to which the edge is directed. Node numbers will always be greater than zero.The number of test cases will not more than 20,and the number of the node will not exceed 10000.The inputs will be ended by a pair of -1.输出
For each test case display the line "Case k is a tree." or the line "Case k is not a tree.", where k corresponds to the test case number (they are sequentially numbered starting with 1).样例输入
6 8 5 3 5 2 6 4 5 6 0 08 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0
-1 -1
样例输出
Case 1 is a tree.
Case 2 is a tree.
Case 3 is not a tree.
分析:
首先我们要理解对于一棵树的要求:
1.树中的每一个节点的父节点有且仅有一个(根节点除外,根节点没有父节点),每一个节点的孩子节点可以有一个到多个;
2.树是一种从父节点向下指向孩子节点的结构,不能出现一个孩子节点指向其父节点,或则父节点的父节点等情况;
3.对于一棵树来说,有且仅能有一个根节点。
应用并查集的知识来判断,如果要加入的子节点已经有父节点,或则是说要加入的父节点和孩子节点有相同的父节点的话,这都是在加入节点的时候都不满足树的条件的,之后的系欸按就没有必要加入了,因为已经不满足。或则树建成以后,发现不仅仅有一棵树,也不满足。
代码:
#include<stdio.h>
#include<iostream>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<algorithm>
#include<set>
using namespace std;
int parent[10000];
int flag;
void init()///初始化,把每个节点的父节点都当作其本身
{
for(int i=1; i<=10000; i++)
parent[i]=i;
}
int Find(int a)///递归查找结点a的父节点
{
if(parent[a]==a) return a;
else
return Find(parent[a]);
}
void UpDate(int a,int b)
{
int x=Find(a);
int y=Find(b);
// cout<<"a=="<<a<<"x=="<<x<<"b=="<<b<<"y=="<<y<<endl;
if(parent[b]!=b||x==y)///表示b在添加父节点a之前已经有父节点,或则a与b有相同的父节点这就构成了环
{
flag=1;
}
if(x!=y)
{
parent[y]=x;
}
}
int main()
{
int a,b;
int op=1;
init();
flag=0;
set<int>s;
set<int>::iterator it;///为set集合定义一个迭代器
while(~scanf("%d%d",&a,&b))
{
if(a==0&&b==0)///当前这棵树结束的标志
{
int sum=0;
for(it=s.begin(); it!=s.end(); it++)
{
if(Find(*it)==*it)///如果他的父节点是他自己,也就意为着他是整棵树的根节点
sum++;
if(sum>1)///根结点的个数多于一个,肯定不是一棵树
{
flag=1;///标记当前的已经不满足一棵树的条件了
break;
}
}
if(flag==0)
printf("Case %d is a tree.\n",op);
if(flag==1)
printf("Case %d is not a tree.\n",op);
s.clear();///set集合清空
init();///再重新把每个节点的父节点指向其本身
op++;
flag=0;
}
else if(a==-1&&b==-1)///整个输入结束的标志
break;
else
{
s.insert(a);
s.insert(b);
if(flag==0)
UpDate(a,b);///只有当前的这个树还满足数的结构在加入判断
else///如果已经不满足树的结构了,就没有必要在进行了
continue;
}
}
return 0;
}
NYOJ 129 树的判定 (并查集)的更多相关文章
- nyoj 129 树的判定
并查集+欧拉 树的判定 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 A tree is a well-known data structure that is e ...
- [BZOJ3038]上帝造题的七分钟2 树状数组+并查集
考试的时候用了两个树状数组去优化,暴力修改,树状数组维护修改后区间差值还有最终求和,最后骗了40分.. 这道题有好多种做法,求和好说,最主要的是开方.这道题过的关键就是掌握一点:在数据范围内,最多开方 ...
- hdu 5458 Stability(树链剖分+并查集)
Stability Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Total ...
- 【BZOJ4025】二分图(线段树分治,并查集)
[BZOJ4025]二分图(线段树分治,并查集) 题面 BZOJ 题解 是一个二分图,等价于不存在奇环. 那么直接线段树分治,用并查集维护到达根节点的距离,只计算就好了. #include<io ...
- 【CF938G】Shortest Path Queries(线段树分治,并查集,线性基)
[CF938G]Shortest Path Queries(线段树分治,并查集,线性基) 题面 CF 洛谷 题解 吼题啊. 对于每个边,我们用一个\(map\)维护它出现的时间, 发现询问单点,边的出 ...
- 【loj6038】「雅礼集训 2017 Day5」远行 树的直径+并查集+LCT
题目描述 给你 $n$ 个点,支持 $m$ 次操作,每次为以下两种:连一条边,保证连完后是一棵树/森林:询问一个点能到达的最远的点与该点的距离.强制在线. $n\le 3\times 10^5$ ,$ ...
- 【bzoj2870】最长道路tree 树的直径+并查集
题目描述 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数. 输入 第一行N 第二行N个数分别表示1~N的点权v[i] 接下来N-1行每 ...
- POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)
传送门 The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8690 Acce ...
- BZOJ-2049 Cave洞穴勘测 动态树Link-Cut-Tree (并查集骗分TAT)
2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 5833 Solved: 2666 [Submit] ...
随机推荐
- 软工网络15团队作业4-DAY6
每日例会 昨天的工作. 张陈东芳:sql语句查询商品信息 吴敏烽:商品类的规范化编写 周汉麟:界面的排版优化 林振斌:商品类排序的实现 李智:研究商品信息的显示 全体人员:初次统一调试 今天计划的工作 ...
- Hive查看执行日志
HIVE-如何查看执行日志 HIVE既然是运行在hadoop上,最后又被翻译为MapReduce程序,通过yarn来执行.所以我们如果想解决HIVE中出现的错误,需要分成几个过程 HIVE自身翻译成为 ...
- 关于command 'gcc' failed with exit status 1 解决方法
Python踩坑之路 Setup script exited with error: command 'gcc' failed with exit status 1 由于没有正确安装Python开发环 ...
- 利用C#进行文件读写的方法选择总结
小的文本文件(100M以下)直接用File类的ReadAllText()和WriteAllText()方法 这两个方法内部其实就是封装了StreamReader类的ReadToEnd()和Stream ...
- @Resource 注解的作用【和 @Autowired 的对比】
今天看到一段代码使用的是 @Resource 的注解,的确是第一次看到这个注解,百度一查才知道,原来和 @Autowired 效果一样,但也有一定的区别. 两个注解都可以用来注入 bean ,@Res ...
- EM算法[转]
最大期望算法:EM算法. 在统计计算中,最大期望算法(EM)是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐藏变量. 最大期望算法经过两个步骤交替进行计算: 第 ...
- 使用Empire自动获取域管理员
使用Empire自动获取域管理员 译:backlion 前言 自从Empire和BloodHound被应用来,对AD渗透已经可以获取到内网环境95%的信息量.作者发现自己一遍又一遍地在做同样重复的事 ...
- 公告:开通csdn博客,敬请关注!
公告:开通csdn博客,敬请关注!地址:https://blog.csdn.net/cyjch
- 如何修改mac 电脑的hosts 文件
mac 电脑的hosts 文件对于一般用户而言是只读的,对于系统管理员而言是可以修改的. hosts文件所在的路径是: /etc/hosts 因为需要系统管理员所以命令是: 输入密码,然后就可以修改了 ...
- vim,删除所有
vim 删除所有内容:方法1: 按ggdG方法2: :%d