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. C#检验数据有效性验证类

    using System; using System.Text; using System.Text.RegularExpressions; namespace Dachie.Common { /// ...

  2. ThinkPadTablet如何恢复出厂状态

    ThinkPad Tablet恢复出厂操作教程: 第一步:开机看到“LENOVO”图标后不停按机器侧面音量增大键,直到出现“Booting recovery kernel image”字样. 第二步: ...

  3. C#父类对象和子类对象之间的转化

    1. 子类到父类 Chinese c = new Chinese(); Person p1 = c;  //从变量c看是一个中国人,所以可以把人的标签贴上去 2. 父类到子类 Chinese c2 = ...

  4. 【CSS】Intermediate6:Display

    1display :inline/block/none 2.inline value Cause all list items in a list to appear next to each oth ...

  5. vijosP1319 数列

    vijosP1319 数列 链接:https://vijos.org/p/1319 [思路] 数学. 相当于交换进制2为k. [代码] #include<iostream> using n ...

  6. POJ-3070Fibonacci(矩阵快速幂求Fibonacci数列) uva 10689 Yet another Number Sequence【矩阵快速幂】

    典型的两道矩阵快速幂求斐波那契数列 POJ 那是 默认a=0,b=1 UVA 一般情况是 斐波那契f(n)=(n-1)次幂情况下的(ans.m[0][0] * b + ans.m[0][1] * a) ...

  7. WCF入门(一)——基本知识

    构建一个WCF程序通常分为三个部分:服务类(Server).宿主(Host).客户程序(Client).有一个很重要的程序集(System.ServeiceModel)要引用,它包含WCF的核心功能. ...

  8. git 版本历史

    版本:git rev-parse --git-dir显示Git版本库的位置   --show-cdup显示当前工作区目录的深度  --parseopt解析命令行参数 $ git rev-parse - ...

  9. android智能家居在线语音控制

    对于android 智能家居项目,如果能实现语音控制,无疑会丰富项目功能,改善用户体验,android语音识别的方法有三种:一是使用intent调用语音识别程序,二 是应用程序自己调用语音识别库,三是 ...

  10. YII访问数据库

    YII访问数据库 CDbConnection: 一个抽象数据库连接 CDbCommand: SQL statement CDbDataReader: 匹配结果集的一行记录 CDbTransaction ...