Is It A Tree?(并查集)
Description
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.

In this problem you will be given several descriptions of
collections of nodes connected by directed edges. For each of these you
are to determine if the collection satisfies the definition of a tree or
not.
Input
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.
Output
"Case k is not a tree.", where k corresponds to the test case number
(they are sequentially numbered starting with 1).
Sample Input
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
Sample Output
Case 1 is a tree.
Case 2 is a tree.
Case 3 is not a tree. 题目意思:判断所给的数据能否构成一颗树。 解题思路:题目中所给的是有向树,并给出了性质:
1.只有一个节点,称为根节点,没有定向边指向它。
2.除了根节点外,每个节点都只有有一条指向它的边。
3.从树根到任一结点有一条有向通路。
抽象过来就是三个条件:
1.只有一个入度为0的点,作为根节点。
2.除根节点外,其他点的入度只能为1。
3.所有点都能连通,也就是所有点需要在一个集合中,使用并查集来划分集合。 注意!!!可能会出现空树,也就是0 0,空树也是树。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX=1e4+;
int pre[MAX];///并查集记录父亲节点
int in[MAX];///入度
int vis[MAX];///节点是否存在
void init()
{
int i;
for(i=; i<MAX; i++)
{
vis[i]=;
in[i]=;
pre[i]=i;
}
}
int Find(int x)
{
if(pre[x]==x)
{
return x;
}
else
{
return Find(pre[x]);
}
}
void Union(int root1,int root2)
{
int x,y;
x=Find(root1);
y=Find(root2);
if(x!=y)
{
pre[x]=y;
}
}
int main()
{
int i,root,counts,a,b,flag,ans=;
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a==-&&b==-)
{
break;
}
if(a==&&b==)///空树
{
printf("Case %d is a tree.\n",ans);
ans++;
continue;
}
init();
vis[a]=;
vis[b]=;
in[b]++;
Union(a,b);
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a==&&b==)
{
break;
}
vis[a]=;
vis[b]=;
in[b]++;
Union(a,b);
}
flag=;
root=;
counts=;
for(i=;i<MAX;i++)
{
if(vis[i]&&in[i]==)///根节点个数
{
root++;
}
if(in[i]>=)///除根节点外,其他点入度需为1
{
flag=;
}
if(vis[i]&&pre[i]==i)///所有点都在一个集合中
{
counts++;
}
}
if(root!=||counts>)
{
flag=;
}
if(flag)
{
printf("Case %d is a tree.\n",ans);
ans++;
}
else
{
printf("Case %d is not a tree.\n",ans);
ans++;
}
}
return ;
}
Is It A Tree?(并查集)的更多相关文章
- Hdu.1325.Is It A Tree?(并查集)
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- Is It A Tree?(并查集)
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26002 Accepted: 8879 De ...
- CF109 C. Lucky Tree 并查集
Petya loves lucky numbers. We all know that lucky numbers are the positive integers whose decimal re ...
- HDU 5606 tree 并查集
tree 把每条边权是1的边断开,发现每个点离他最近的点个数就是他所在的连通块大小. 开一个并查集,每次读到边权是0的边就合并.最后Ansi=size[findset(i)],size表示每个并 ...
- [Swust OJ 856]--Huge Tree(并查集)
题目链接:http://acm.swust.edu.cn/problem/856/ Time limit(ms): 1000 Memory limit(kb): 10000 Description T ...
- Codeforces Round #363 (Div. 2)D. Fix a Tree(并查集)
D. Fix a Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- Is It A Tree?(并查集)(dfs也可以解决)
Is It A Tree? Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submi ...
- tree(并查集)
tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- 树上统计treecnt(dsu on tree 并查集 正难则反)
题目链接 dalao们怎么都写的线段树合并啊.. dsu跑的好慢. \(Description\) 给定一棵\(n(n\leq 10^5)\)个点的树. 定义\(Tree[L,R]\)表示为了使得\( ...
- hdu 1325 Is It A Tree? 并查集
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
随机推荐
- Oracle 执行计划的查看方式
访问数据的方法:一.访问表的方法:1.全表扫描,2.ROWID扫描 二.访问索引的方法:1.索引唯一性扫描,2.索引范围扫描,3.索引全扫 ...
- react 第一个组件 “hello world!”
一:在src下面新建Welcome.js 二:在Welcome.js中使用类式写法: import React from "react" class Welcome extends ...
- yyy loves Maths VII(状压DP)
题目背景 yyy对某些数字有着情有独钟的喜爱,他叫他们为幸运数字;然而他作死太多,所以把自己讨厌的数字成为"厄运数字" 题目描述 一群同学在和yyy玩一个游戏 每次,他们会给yyy ...
- 【Linux】日志分析及管理
日志的作用 用于记录系统.程序运行中发生的各种事件 eg: [root@localhost ~]# yum install -y httpd [root@localhost ~]# tail ...
- 请问在一个命令上加什么参数可以实现下面命令的内容在同一行输出。 echo "zhaokang";echo "zhaokang"
请问在一个命令上加什么参数可以实现下面命令的内容在同一行输出. echo "zhaokang";echo "zhaokang" [root@zhaokang t ...
- s3c2440存储控制器详解
从上图可知,外部内存类的设备与存储管理器相连,那么CPU是怎样访问到内存的呢?通过存储管理器.CPU比较单纯,只会按照指令执行,CPU只负责发出地址,怎样找到内存类设备呢?这些都交给存储管理器来管理. ...
- PTA(BasicLevel)-1006换个格式输出整数
一 换格式输出整数 用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数.例如 234 应该被 ...
- sqlserver之group by 与over函数
group by 函数主要用来对数据进行分组,over()函数则是一个“开窗函数”,它更多的是与聚合函数如:sum().max().min().avg().count()等函数以及排名函数如:row_ ...
- C语言 迭代部分的代码编写
C语言代码学习 迭代部分 迭代要用到函数部分的知识,一开始我写了计算n!的计算,代码和运行结果如下: 结果只能单一的计算出整数内的值,如果输入负值则结果为返回值1,显然是不对的,根据查书学习以后,知道 ...
- 20155320 2016-2017-2《Java程序设计》第十周学习总结
20155320 2016-2017-2<Java程序设计>第十周学习总结 教材学习内容总结 本周学习目标 了解计算机网络基础 掌握Java Socket编程 理解混合密码系统 掌握Jav ...