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?(并查集)详解的更多相关文章

  1. 算法手记 之 数据结构(并查集详解)(POJ1703)

    <ACM/ICPC算法训练教程>读书笔记-这一次补上并查集的部分.将对并查集的思想进行详细阐述,并附上本人AC掉POJ1703的Code. 在一些有N个元素的集合应用问题中,通常会将每个元 ...

  2. - > 并查集详解(第二节)

    以下是并查集思路详解: 一:概念 并查集处理的是“集合"之间的关系.当给出两个元素的一个无序数对(a,b)时,需要快速“合并”a和b分别所在的集合,这期间需要反复“查找”某元素所在的集合.“ ...

  3. Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】

    转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...

  4. 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 ...

  5. Is It A Tree?(并查集)

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26002   Accepted: 8879 De ...

  6. CF109 C. Lucky Tree 并查集

    Petya loves lucky numbers. We all know that lucky numbers are the positive integers whose decimal re ...

  7. HDU 5606 tree 并查集

    tree 把每条边权是1的边断开,发现每个点离他最近的点个数就是他所在的连通块大小. 开一个并查集,每次读到边权是0的边就合并.最后Ans​i​​=size[findset(i)],size表示每个并 ...

  8. [Swust OJ 856]--Huge Tree(并查集)

    题目链接:http://acm.swust.edu.cn/problem/856/ Time limit(ms): 1000 Memory limit(kb): 10000 Description T ...

  9. 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 ...

  10. Is It A Tree?(并查集)(dfs也可以解决)

    Is It A Tree? Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submi ...

随机推荐

  1. MVC系统过滤器、自定义过滤器

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  2. 在Eclipse中使用Github(EGit)

    安装配置EGit 1. 安装Windows版的Git,登陆Github账号,登陆成功后会自动在本地和Github配置好密钥 2. 在Eclipse中安装EGit,地址http://download.e ...

  3. 转载--C++ STL

    转自:http://wenku.baidu.com/view/15d18b4533687e21af45a9a4.html 1.C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vec ...

  4. 初学redux笔记,及一个最简单的redux实例

    categories: 笔记 tags: react redux 前端框架 把初学redux的一些笔记写了下来 分享一个入学redux很合适的demo, 用redux实现计数器 这是从阮一峰老师git ...

  5. 【CSS】Intermediate7:Pseudo Elements

    1.selector:pseudo element{property:value;} 2.first-letter  first-line CSS3:: 与pseudo class 区别 old br ...

  6. linux进程的几种状态

    Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态. Linux进程状态:R (TASK_RUNNING),可执行状态. 只有在该状 ...

  7. HDU 1117 免费馅饼 二维动态规划

    思路:a[i][j]表示j秒在i位置的数目,dp[i][j]表示j秒在i位置最大可以收到的数目. 转移方程:d[i][j]=max(dp[i-1][j],dp[i-1][j-1],dp[i-1][j+ ...

  8. 使用Windows Azure创建Windows系统虚拟机-下

    如何在创建虚拟机之后登录虚拟机 这部分将展示如何登录到虚拟机,所以你可以管理它的设置和你会上面运行的应用程序. 注意: 对于要求和故障排除技巧,请参阅“使用RDP或SSH连接到Azure虚拟机”( C ...

  9. PLSQL配置介绍

    PLSQL配置简介,优化   来自为知笔记(Wiz) 附件列表 s=selectf=FROMw=WHEREsf=SELECT * FROMdf=DELETE FROMsc=SELECT COUNT(* ...

  10. Storm系列(十)聚流示例

    功能:将多个数据源的数据汇集到一个处理单元进行集中分类处理: 入口类TestMain 1  ; i < size; i++) { 31              content += input ...