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. Spring读取加密属性文件处理

    引言:Spring框架俨然已经是目前Java WEB项目开发的一个宠儿,更有人将Spring, Struts,和Hibernage称之为Java WEB项目开发的3件利器.Spring的依赖.注入.A ...

  2. 【转】CUDA5/CentOS6.4

    转载自http://wenzhang.baidu.com/article/view?key=076f36658dd0828c-1393896446 This article explains how ...

  3. Java笔记(二十六)……IO流上 字节流与字符流

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  4. wuzhicms模版语法

    在模版中使用的语法规则: 例如:templates/default/content/show.html 1.变量表示 {$title} 被解析成 <?php echo $title;?> ...

  5. 微软Azure 存储管理器的简单介绍

    Windows Azure存储用户经常希望能够在“管理器”中查看他们的数据,管理器指的是一款可用于显示存储帐户数据的工具.我们之前提供了我们所知的存储管理器列表.在本文中,我们将对此列表进行更新,使其 ...

  6. Android webView 中loadData方法加载 带中文时出现乱码

    WebView出现乱码用LoadData方法来解析html的,但是据说这是官方的一个BUG,不能用来解析中文. 采用loadDataWithBaseURL的方法,其中codeingType设置为utf ...

  7. 获取所有组合算法、获取全排列算法(java)

    转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5574516.html 受到ACM1015的影响,个人感觉,有必要对统计学上的 全组合和全排列 进行一个简单的总结 ...

  8. maven依赖范围

    Scope: Compile:编译依赖,默认就是compile,在编译.测试.运行都有效 Test:测试依赖,仅测试有效 例如Junit Provided:已提供依赖范围.编译.测试有效,运行时候无效 ...

  9. [网络]让局域网的电脑通过路由的公网ip可以被访问到的设置

    http://公网IP:服务端口/访问路径(http://110.16.166.135:8081/pra/unionpay/v_asyn_notify.jspx这个地址就会通过公网ip来访问到你的ip ...

  10. FrankFan7你问我答之一

    作者:范军 (Frank Fan) 新浪微博:@frankfan7   微信:frankfan7 最近网友留言很多,你既然看得起我问了,我就说说个人浅见.看看就行了,也别认真. Q:你具体工作是什么? ...