poj1308 Is It A Tree?(并查集)详解
poj1308 http://poj.org/problem?id=1308
题目大意:输入若干组测试数据,输入 (-1 -1) 时输入结束。每组测试数据以输入(0 0)为结束标志。然后根据所给的所有(父亲, 孩子)数据对判断 是否能构成一棵树。
分析: 都以了解树只有一个根节点,那么我们就判断是不是有多个树;又知道每个节点只有一个父亲节点,那么我们就判断他是不是构成环,成环则不是树。
注意: ①可以是空树; ②所给的节点构成森林(多个树)是不可以的,必须只能构成一棵树。
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std; int out, flag, x, y, num, pre[];
int find(int a)//查找根节点
{
int r, i, j;
r = a; i = a;
while(pre[r] != r)
r = pre[r];
while(pre[i] != r)
{
j = pre[i];
pre[i] = r;
i = j;
}
return r;
}
int main()
{
num = ; out = ;
while(out)
{
//先对所有节点的根节点进行初始化
for(int i = ; i <= ; i++)
pre[i] = i; flag = ;
while(scanf("%d%d", &x, &y))
{
if(x == && y == )
break;
else if(x == - && y == -)
{
out = ;
break;
}
int fx = find(x);
int fy = find(y);
//此处我们判断是否构成环
//如果x和y的根节点相同,那么他们已经是属于同一棵树
//若x又是y的父亲节点,那么将构成环
if(fx == fy)
flag = ;
//如果x和y根节点不同,即不属于同一棵树, 那么将其合并成一棵树
else if(fx != fy)
pre[fy] = fx;
}
int k = ;
//此处我们判断是不是森林,对所有节点(不包括没涉及的点)的根节点
//进行统计,若不都一样那么说明存在多个跟, 有多颗树, 否则是一棵树。
for(int i = ; i <= ; i++)
{
int ans = find(i);
if(ans != i && k == )
k = ans;
else if(k != && ans != i)
{
if(ans != k)
flag = ;
}
}
if(out == && flag == )
printf("Case %d is not a tree.\n", ++num);
else if(out == && flag == )
printf("Case %d is a tree.\n", ++num);
}
return ;
}
杭电的1272 和这个题差不多 稍微改改就可以了。
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std; int out, flag, x, y, pre[];
int find(int a)
{
int r, i, j;
r = a; i = a;
while(pre[r] != r)
r = pre[r];
while(pre[i] != r)
{
j = pre[i];
pre[i] = r;
i = j;
}
return r;
}
int main()
{
out = ;
while(out)
{
for(int i = ; i <= ; i++)
{
pre[i] = i;
}
flag = ;
while(scanf("%d%d", &x, &y))
{
if(x == && y == )
break;
else if(x == - && y == -)
{
out = ;
break;
}
int fx = find(x);
int fy = find(y);
if(fx != fy)
{
pre[fx] = fy;
}
else if(fx == fy)
{
flag = ;
}
}
int k = ;
for(int i = ; i <= ; i++)
{
int ans = find(i);
if(ans != i && k == )
k = ans;
else if(k != && ans != i)
{
if(ans != k)
flag = ;
}
}
if(out == && flag == )
printf("No\n");
else if(out == && flag == )
printf("Yes\n");
}
return ;
}
poj1308 Is It A Tree?(并查集)详解的更多相关文章
- 算法手记 之 数据结构(并查集详解)(POJ1703)
<ACM/ICPC算法训练教程>读书笔记-这一次补上并查集的部分.将对并查集的思想进行详细阐述,并附上本人AC掉POJ1703的Code. 在一些有N个元素的集合应用问题中,通常会将每个元 ...
- - > 并查集详解(第二节)
以下是并查集思路详解: 一:概念 并查集处理的是“集合"之间的关系.当给出两个元素的一个无序数对(a,b)时,需要快速“合并”a和b分别所在的集合,这期间需要反复“查找”某元素所在的集合.“ ...
- Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】
转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...
- 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 ...
随机推荐
- 从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍. 本文是介绍两个最常用的jQuery插件. 分别用 ...
- 一行代码搞定Adapter
15年Google I/O大会发不了三个重要支持库 >Material design (Android Support Design) >百分比布局:Percent support lib ...
- 关于HTTP返回码301、302区别与SEO
301(永久移动)请求的网页已永久移动到新位置.服务器返回此响应时,会自动将请求者转到新位置.您应使用此代码告诉搜索引擎Spider某个网页或网站已永久移动到新位置.建议在URL规范化的时候采用301 ...
- [liu yanling]软件测试用例的基本要素包括哪些?
用例编号: 测试用例的编号有一定的规则,比如系统测试用例的编号这样定义规则: PROJECT1-ST-001 ,命名规则是项目名称+测试阶段类型(系统测试阶段)+编号.定义测试用例编号,便于查找测试用 ...
- 使--no-ri --no-rdoc成为gem安装的默认选项
在使用gem install命令的时候,希望加上--no-ri --no-rdoc选项,但是不希望每一次都手动加上这个选项. 其实可以通过编辑配置文件,改变gem install的默认选项. 在win ...
- Linux中的模式转换
模式转换: 编辑-->输入: i: 在当前光标所在字符的前面,转为输入模式: a: 在当前光标所在字符的后面,转为输入模式: o: 在当前光标所在行的下方,新建一行,并转为输入模式: I:在当前 ...
- 使用WIF实现单点登录Part II —— Windows Identity Foundation基本原理 -摘自网络
在上一篇文章中,我们已经使用WIF构建了一个基于MVC4的简单的身份验证程序,在这篇文章里,我们将探讨一下到底什么是WIF,以及它的工作原理.然后在下一篇文章开始,我们将实际操作,实现单点登录功能. ...
- hdoj 2579 Dating with girls(2)【三重数组标记去重】
Dating with girls(2) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- day1作业
作业一:博客 作业二:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 作业三:多级菜单 三级菜单 可依次选择进入各子菜单 所需新知识点:列表.字典 作业一分析: readme.m ...
- 网络爬虫之Windows环境Heritrix3.0配置指南
一.引言: 最近在忙某个商业银行的项目,需要引入外部互联网数据作为参考,作为技术选型阶段的工作,之前已经确定了中文分词工具,下一个话题就是网络爬虫的选择,目标很明确,需要下载一些财经网站的新闻信息,然 ...