题目链接

描述

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. 201621123037 《Java程序设计》第3周学习总结

    #Week03-面向对象入门 1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联 ...

  2. 【Leetcode】72 Edit Distance

    72. Edit Distance Given two words word1 and word2, find the minimum number of steps required to conv ...

  3. 使用nginx反向代理时,如何正确获取到用户的真实ip

    在记录日志的的时候,获取用户的信息,比如用户的ip,浏览器等等信息是十分重要的. 但是在使用nginx反向代理的时候,可能经过转发无法获取到用户的真实的ip, 在此情况下需要配置nginx,让其在转发 ...

  4. python获取toast 验证

    appium版本 1.6.3  desired_caps['automationName']='uiautomator2'    def _find_toast(self,message,timeou ...

  5. solr源码分析之solrclound

    一.简介 SolrCloud是Solr4.0版本以后基于Solr和Zookeeper的分布式搜索方案.SolrCloud是Solr的基于Zookeeper一种部署方式.Solr可以以多种方式部署,例如 ...

  6. 【bzoj3774】最优选择 网络流最小割

    题目描述 小N手上有一个N*M的方格图,控制某一个点要付出Aij的代价,然后某个点如果被控制了,或者他周围的所有点(上下左右)都被控制了,那么他就算是被选择了的.一个点如果被选择了,那么可以得到Bij ...

  7. [BZOJ4027]兔子与樱花

    4027: [HEOI2015]兔子与樱花 Time Limit: 10 Sec  Memory Limit: 256 MB Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突 ...

  8. [洛谷P5190][COCI 2010] PROGRAM

    题目大意:给你$k(k\leqslant10^6)$个数,$f(x)$表示$x$的约数在$k$个数中出现的次数,在这任何数都是$0$的约数.$m(m\leqslant10^6)$次询问,每次给出$l, ...

  9. 分治FFT

    目录 分治FFT 目的 算法 代码 分治FFT 目的 解决这样一类式子: \[f[n] = \sum_{i = 0}^{n - 1}f[i]g[n - i]\] 算法 看上去跟普通卷积式子挺像的,但是 ...

  10. 【BZOJ1226】学校食堂(动态规划,状态压缩)

    [BZOJ1226]学校食堂(动态规划,状态压缩) 题面 BZOJ 洛谷 题解 发现\(b\)很小,意味着当前这个人最坏情况下也只有后面的一小部分人在他前面拿到饭. 所以整个结果的大致顺序是不会变化的 ...