HDU 1325 Is It A Tree?(并查集)
题目大意:
给你两个节点,前者指向后者(可以认为前者是后者的父节点),然后让你判断是否是一棵树。
解题思路:
先说说这道题和小希的迷宫(HDU1272)那道题的区别,前者给出的两个点是有方向的,而后者是没有的,这就是唯一的区别。再者这道题其实就是让你判断所有的点最后所形成的图是否是一棵树。做这道题时错误了很多遍,细想之,主要是开始思路不好,很容易乱,理清思路让代码变得清晰起来就好了。判断一个图是否为一棵树。有三个重要条件(比小希的迷宫多了一个条件):
1:已经在一个集合里面的两个数不能再同时出现了(无环图)。
2:根节点只有一个(是树不是森林)。
3:除了根节点之外所有的节点的入度为一。
上面三个条件都满足了就是一颗树了,对于第一个条件,即判断是否新给的两个数的根节点是否相同。第二个条件最后统计一下根节点的数量是否小于2,(不是等于一,因为空树也是树,根节点为0~~~),第三个条件,可以观察观察数据,入度是指被指向的那个点,对于每次给定的两个数,后面那个数字出现的次数即是这个点的入度。所以可以用一个数组,利用下标代表这个点,利用值代表出现的次数。最后统计下看是否有出现次数大于一的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <algorithm>
using namespace std;
const int MAXN = 1e5 + ;
int pre[MAXN]; //储存父节点
bool bol[MAXN]; //这个点是否出现过
int flag1 = ; //代表入度是否满足是一个树
int flag2 = ; //代表是否成环。
int cnt[MAXN]; //记录出现的点的入度 int Find(int x)
{
int r = x;
while(pre[r] != r)
{
r = pre[r];
}
int i = x,j;
while(pre[i] != r)
{
j = i;
i = pre[i];
pre[j] = r;
}
return r;
} void Mix(int a,int b)
{
int x = Find(a);
int y = Find(b);
if(x > y)
{
pre[x] = y;
}
if(x < y)
{
pre[y] = x;
}
} int Search()
{
int cnt = ;
for(int i = ; i <= MAXN; i++)
{
if(bol[i])
if(pre[i] == i)
cnt++;
}
return cnt;
} int main()
{
int M,N;
flag1 = ; //一大堆初始化0.0
flag2 = ;
for(int i = ; i <= MAXN; i++)
{
pre[i] = i;
bol[i] = false;
}
memset(cnt,,sizeof(cnt));
int kas = ;
while(~scanf("%d%d",&M,&N)&&(M != - || N != -))
{
bol[M] = true;
bol[N] = true;
cnt[N]++;
if(M != && N != )
{
int m = Find(M);
int n = Find(N);
if(m == n)
flag2 = ; //出现了环
Mix(M,N);
}
else
{
int single = Search(); //根节点的个数
for(int i = ; i <= MAXN;i++)
{
if(cnt[i] > )
flag1 = ; //有入度大于一的出现
}
if(single < && flag1 && flag2) printf("Case %d is a tree.\n",kas++); //三个条件都满足
else printf("Case %d is not a tree.\n",kas++);
flag1 = ;
flag2 = ;
for(int i = ; i <= MAXN; i++)
{
pre[i] = i;
bol[i] = false;
}
memset(cnt,,sizeof(cnt));
}
}
return ;
}
HDU 1325 Is It A Tree?(并查集)的更多相关文章
- 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 ...
- hdu 1325 Is It A Tree? 并查集
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 5458 Stability(树链剖分+并查集)
Stability Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Total ...
- [HDU 3712] Fiolki (带边权并查集+启发式合并)
[HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...
- HDU 5606 tree 并查集
tree 把每条边权是1的边断开,发现每个点离他最近的点个数就是他所在的连通块大小. 开一个并查集,每次读到边权是0的边就合并.最后Ansi=size[findset(i)],size表示每个并 ...
- tree(并查集)
tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- hdu 5652 India and China Origins 并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题目大意:n*m的矩阵上,0为平原,1为山.q个询问,第i个询问给定坐标xi,yi,表示i年后这 ...
- 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 - 1829 A Bug's Life (并查集)&&poj - 2492 A Bug's Life && poj 1703 Find them, Catch them
http://acm.hdu.edu.cn/showproblem.php?pid=1829 http://poj.org/problem?id=2492 臭虫有两种性别,并且只有异性相吸,给定n条臭 ...
随机推荐
- dp类模板
1.n串最长公共子序列 #include<cstdio> #include<cstring> #include<algorithm> using namespace ...
- SRM707 div1 MultiplyAddPuzzle
题目大意:给定4个数,s,t,a,b 每次可以将s加a或者乘b,问最少多少次可以得到t 做法:考虑最后的形式,肯定是s*b^n + a*f(b),f(b)是关于b的多项式 那么b乘多少次实际上是可以知 ...
- 深入探讨Android异步精髓Handler
探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架 ...
- javascript中top、clientTop、scrollTop、offsetTop的讲解
下面结合各上图介绍一下各个属性的作用: 一.offsetTop属性: 此属性可以获取元素的上外缘距离最近采用定位父元素内壁的距离,如果父元素中没有采用定位的,则是获取上外边缘距离文档内壁的距离.所谓的 ...
- iOS 单元测试(Unit Test 和 UI Test)
之前一直搞过~~最近试了一下下,完美~~ 附上一篇文章,不同的伙伴可以看看: http://www.jianshu.com/p/009844a0b9edUnitTest(简单的单元测试使用) http ...
- jaspersoft中分组打印
一:前言 使用IReport已经四个月了,最近在做一个保镖,是要按照类型分类,并且这些类型要横着打印,最后还要算这个类型金额的总值,这张报表现是说需要用到子报表,最后和一个同事一起用group来分组做 ...
- codeforces 111D
题目链接 D. Petya and Coloring time limit per test 5 seconds memory limit per test 256 megabytes input s ...
- 组合数学--Polya 原理及典型应用
Redfield-Polya (Pólya enumeration theorem,简称PET)定理是组合数学理论中最重要的定理之一.自从 1927 年 Redfield 首次运用 group red ...
- jQuery操纵DOM
一.基本操作 1.html() - 类似于原生DOM的innerHTML属性 *获取 - html(); *设置 - html("html代码"); 2.val() - 类似于原生 ...
- [POJ1180&POJ3709]Batch Scheduling&K-Anonymous Sequence 斜率优化DP
POJ1180 Batch Scheduling Description There is a sequence of N jobs to be processed on one machine. T ...