hdoj1325 Is It A Tree?
题意:
多组测试数据, 每组数据有多个数对, 表示一条有向边(即第一个数是第二个数的父节点), 以 0,0 为一组测试数据结束标志。当输入-1,-1时测试结束。 从那些给出的信息中判断是否是一棵树。
分析:
1、只可以有一个根节点, 也可以是一个点都没有的空树;
2、除了根节点, 每个点只有一个父节点。
3、因为只可以有一个父节点, 所以我们可以把一个合法的关系对(一个父亲节点与孩子节点对)合并到一个集合里, 他们的父节点都标记为所属树的根节点, 那样我们方便判断是否成环。
4、判断是否成环, 成环不可以。
5、 还有一个很衰的地方, 注意不光输入-1,-1 测试结束, 只要输入两个数都小于0就结束。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std; const int N = ; int a, b, n, mi, mx, sum, flag, v[N], pre[N];
int find(int x)//寻找x所属的树的根节点
{
int r, i, j;
r = x; i = x;
while(r != pre[r])
r = pre[r];
while(pre[i] != r)
{
j = pre[i];
pre[i] = r;
i = j;
}
return pre[x];
}
int main()
{
n = ;
while(scanf("%d%d", &a, &b) != EOF)
{
memset(v, , sizeof(v));//记录所涉及的点
for(int i = ; i <= N; i++)
pre[i] = i;
if(a < && b < ) break;
else if(a == && b == )//特殊处理, 空树
{
printf("Case %d is a tree.\n", ++n);
continue;
}
pre[b] = a;
v[a] = ;
v[b] = ;
mi = min(a, b);
mx = max(a, b);
flag = ;
while(scanf("%d%d", &a, &b) != EOF)
{
if(a == && b == ) break;
if(mx < a || mx < b) mx = max(a, b);
if(mi > a || mi > b) mi = min(a, b);
v[a] = ;
v[b] = ;
if(flag == )
{
int fx = find(a);
int fy = find(b);
if((fy != b) || (fy == fx))//若构成环, 或孩子节点已经有父节点了, 那就是不合法的边
flag = ;
else if(fy == b && fy != fx)//如果不构成环并且没有父亲节点, 那就是合法的, 加入
pre[b] = fx;
}
}
int sum = ;
if(flag == )
{
for(int i = mi; i <= mx; i++)//判断是否存在多棵树
{
if(v[i] == )
{
int fx = find(i);
if(fx == i)
{
sum++;
if(sum > )
{
flag = ;
break;
}
}
}
}
}
if(flag == )
printf("Case %d is a tree.\n", ++n);
else if(flag == )
printf("Case %d is not a tree.\n", ++n);
}
return ;
}
hdoj1325 Is It A Tree?的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
- Leetcode 笔记 101 - Symmetric Tree
题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...
随机推荐
- android WebViewClient的方法解释
1.在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边. public boolean shouldOverrideUrlLo ...
- HDU 4746 Mophues 莫比乌斯反演
分析: http://blog.csdn.net/acdreamers/article/details/12871643 分析参见这一篇 http://wenku.baidu.com/view/fbe ...
- UVA 11754 Code Feat 中国剩余定理+暴力
lrj白书例题,真好 #include <stdio.h> #include <iostream> #include <vector> #include <m ...
- chart控件怎么使x轴标签全部显示出来
在vs2012中使用chart控件事,x轴的标签过多,致使默认只能显示其中的一部分,如图 当然,我们可以通过设置,使得x轴标签全部显示. 首先,通过chart控件属性,找到 “ChartAreas ...
- arcgis android 加载google切片 天地图切片 并且能进行缓存
废话不多说,直接下载,看layer包! https://github.com/Young-Ken/android-gis
- 动态代理入门(jdk)
动态代理就是aop的核心,动态代理简单的就是通过创建一个代理对象,然后把原来的方法增强.很抽象,例子是王道.jdk中提供了动态代理的实现,但是它是针对接口,如果要实现动态代理,需要被代理对象的接口.这 ...
- 用 ggplot2 在同一个图上画多条颜色不同的线
假如数据格式是这样: day 邓文迪 微博 城管0 0.0 9.262970888519191E-4 0.01 0.0 0.00144775855013 ...
- HW4.33
public class Solution { public static void main(String[] args) { int sum; for(int i = 6; i < 1000 ...
- Python模块导入及使用经验回顾 [ 持续更新 ]
1,若需要导入的模块并不是一个简单的*.py文件,而是在Lib目录下的一个文件夹,则要注意检查这个文件夹下有无__init__.py文件(该文件虽然经常为空,但是缺失该文件,对模块的导入有很大的影响) ...
- 注册表-各种功能-隐藏IE、隐藏硬盘、禁用硬件
1.在[我的电脑]上隐藏软驱 在[开始]→[运行]→输入[Regedit]→[HKEY_CURRENT_USER]→[Software] →[Microsoft] →[Windows]→[Curren ...