题目链接

描述

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 0

    8 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 树的判定 (并查集)的更多相关文章

  1. nyoj 129 树的判定

    并查集+欧拉 树的判定 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 A tree is a well-known data structure that is e ...

  2. [BZOJ3038]上帝造题的七分钟2 树状数组+并查集

    考试的时候用了两个树状数组去优化,暴力修改,树状数组维护修改后区间差值还有最终求和,最后骗了40分.. 这道题有好多种做法,求和好说,最主要的是开方.这道题过的关键就是掌握一点:在数据范围内,最多开方 ...

  3. hdu 5458 Stability(树链剖分+并查集)

    Stability Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total ...

  4. 【BZOJ4025】二分图(线段树分治,并查集)

    [BZOJ4025]二分图(线段树分治,并查集) 题面 BZOJ 题解 是一个二分图,等价于不存在奇环. 那么直接线段树分治,用并查集维护到达根节点的距离,只计算就好了. #include<io ...

  5. 【CF938G】Shortest Path Queries(线段树分治,并查集,线性基)

    [CF938G]Shortest Path Queries(线段树分治,并查集,线性基) 题面 CF 洛谷 题解 吼题啊. 对于每个边,我们用一个\(map\)维护它出现的时间, 发现询问单点,边的出 ...

  6. 【loj6038】「雅礼集训 2017 Day5」远行 树的直径+并查集+LCT

    题目描述 给你 $n$ 个点,支持 $m$ 次操作,每次为以下两种:连一条边,保证连完后是一棵树/森林:询问一个点能到达的最远的点与该点的距离.强制在线. $n\le 3\times 10^5$ ,$ ...

  7. 【bzoj2870】最长道路tree 树的直径+并查集

    题目描述 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数. 输入 第一行N 第二行N个数分别表示1~N的点权v[i] 接下来N-1行每 ...

  8. POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)

    传送门 The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8690   Acce ...

  9. BZOJ-2049 Cave洞穴勘测 动态树Link-Cut-Tree (并查集骗分TAT)

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 5833 Solved: 2666 [Submit] ...

随机推荐

  1. mysql中变量

    mysql中的变量: mysql中,有两种变量形式: 普通变量: 不带“@”符号: 定义形式: declare  变量名  类型名   [default  默认值]: //普通变量必须先这样定义 赋值 ...

  2. 第194天:js---函数对象详解(arguments、length)

    一.函数即对象 function add1(a,b){ return a+b; } //Function对象的实例 -- 高级技巧 --- 写框架必须用的... //前面表示参数,后面表示函数语句 v ...

  3. python的N个小功能之正则匹配

    1.. 匹配任意除换行符“\n”外的字符:2.*表示匹配前一个字符0次或无限次:3.+或*后跟?表示非贪婪匹配,即尽可能少的匹配,如*?重复任意次,但尽可能少重复,惰性匹配:4. .*? 表示匹配任意 ...

  4. java map的 keyset()方法

  5. 【bzoj5157】[Tjoi2014]上升子序列 树状数组

    题目描述 求一个数列本质不同的至少含有两个元素的上升子序列数目模10^9+7的结果. 题解 树状数组 傻逼题,离散化后直接使用树状数组统计即可.由于要求本质不同,因此一个数要减去它前一次出现时的贡献( ...

  6. Cells UVALive - 3486(dfs序+手动开栈)

    给一棵树,每次每次询问一个点是否是另一个点的祖先? 输入时是每个下标对应节点的儿子的数量 用dfs序 时间戳.. 如果一个点是另一个点的祖先,那么它的两个标记一定在祖先的范围之内 #include & ...

  7. Day21-Cookie

    1. Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).例如在某个网站上保存了用户名和密码,3个月内 ...

  8. 【BZOJ2141】排队(CDQ分治)

    [BZOJ2141]排队(CDQ分治) 题面 题面以及树套树做法见这里 题解 大部分树套树/主席树这类题目都可以用整体二分/CDQ分治来做. 这题考虑一下,在不考虑修改的情况下 贡献是如何产生的? 我 ...

  9. Java考试题

    1.     public class GC { 2.     private Object o; 3.     private voiddoSomethingElse(Object obj) { o ...

  10. Hadoop1重新格式化HDFS

    注意:原来的数据全部被清空了.产生了一个新的hdfs 1. 删除已有目录 1.1 查看hdfs-site.xml 将 dfs.name.dir和dfs.data.dir所指定的目录删除 vim hdf ...