题目大意:

  给你两个节点,前者指向后者(可以认为前者是后者的父节点),然后让你判断是否是一棵树。

解题思路:

  先说说这道题和小希的迷宫(HDU1272)那道题的区别,前者给出的两个点是有方向的,而后者是没有的,这就是唯一的区别。再者这道题其实就是让你判断所有的点最后所形成的图是否是一棵树。做这道题时错误了很多遍,细想之,主要是开始思路不好,很容易乱,理清思路让代码变得清晰起来就好了。判断一个图是否为一棵树。有三个重要条件(比小希的迷宫多了一个条件):

1:已经在一个集合里面的两个数不能再同时出现了(无环图)。

2:根节点只有一个(是树不是森林)。

3:除了根节点之外所有的节点的入度为一。

上面三个条件都满足了就是一颗树了,对于第一个条件,即判断是否新给的两个数的根节点是否相同。第二个条件最后统计一下根节点的数量是否小于2,(不是等于一,因为空树也是树,根节点为0~~~),第三个条件,可以观察观察数据,入度是指被指向的那个点,对于每次给定的两个数,后面那个数字出现的次数即是这个点的入度。所以可以用一个数组,利用下标代表这个点,利用值代表出现的次数。最后统计下看是否有出现次数大于一的。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <cmath>
  6 #include <cctype>
  7 #include <algorithm>
  8 using namespace std;
  9 const int MAXN = 1e5 + 3;
 10 int pre[MAXN];    //储存父节点
 11 bool bol[MAXN];   //这个点是否出现过
 12 int flag1 = 1;   //代表入度是否满足是一个树
 13 int flag2 =  1;  //代表是否成环。
 14 int cnt[MAXN];   //记录出现的点的入度
 15
 16 int Find(int x)
 17 {
 18     int r = x;
 19     while(pre[r] != r)
 20     {
 21         r = pre[r];
 22     }
 23     int i = x,j;
 24     while(pre[i] != r)
 25     {
 26         j = i;
 27         i = pre[i];
 28         pre[j] = r;
 29     }
 30     return r;
 31 }
 32
 33 void Mix(int a,int b)
 34 {
 35     int x = Find(a);
 36     int y = Find(b);
 37     if(x > y)
 38     {
 39         pre[x] = y;
 40     }
 41     if(x < y)
 42     {
 43         pre[y] = x;
 44     }
 45 }
 46
 47
 48 int Search()
 49 {
 50     int cnt = 0;
 51     for(int i = 1; i <= MAXN; i++)
 52     {
 53         if(bol[i])
 54             if(pre[i] == i)
 55                 cnt++;
 56     }
 57     return cnt;
 58 }
 59
 60 int main()
 61 {
 62     int M,N;
 63     flag1 = 1;        //一大堆初始化0.0
 64     flag2 = 1;
 65     for(int i = 1; i <= MAXN; i++)
 66     {
 67         pre[i] = i;
 68         bol[i] = false;
 69     }
 70     memset(cnt,0,sizeof(cnt));
 71     int kas = 1;
 72     while(~scanf("%d%d",&M,&N)&&(M != -1 || N != -1))
 73     {
 74         bol[M] = true;
 75         bol[N] = true;
 76         cnt[N]++;
 77         if(M != 0 && N != 0)
 78         {
 79             int m = Find(M);
 80             int n = Find(N);
 81             if(m == n)
 82                 flag2 = 0;          //出现了环
 83             Mix(M,N);
 84         }
 85         else
 86         {
 87             int single = Search(); //根节点的个数
 88             for(int i = 1; i <= MAXN;i++)
 89             {
 90                 if(cnt[i] > 1)
 91                     flag1 = 0;        //有入度大于一的出现
 92             }
 93             if(single < 2 && flag1 && flag2) printf("Case %d is a tree.\n",kas++);   //三个条件都满足
 94             else printf("Case %d is not a tree.\n",kas++);
 95             flag1 = 1;
 96             flag2 = 1;
 97             for(int i = 1; i <= MAXN; i++)
 98             {
 99                 pre[i] = i;
100                 bol[i] = false;
101             }
102             memset(cnt,0,sizeof(cnt));
103         }
104     }
105     return 0;
106 }

转载于:https://www.cnblogs.com/Ash-ly/p/5397656.html

HDU 1325 Is It A Tree?(并查集)相关推荐

  1. HDU 1325 Is It A Tree? 并查集

    点击打开链接 Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  2. HDU 1325POJ 1308 Is it A tree ? [并查集+树判定]

    题目链接 poj hdu Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...

  3. HDU 5606 tree 并查集

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

  4. HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  5. HDU 1213 How Many Tables(并查集模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意: 这个问题的一个重要规则是,如果我告诉你A知道B,B知道C,这意味着A,B,C知道对方,所以他们可以 ...

  6. HDU 3974 Assign the task(树 并查集)

    题意  公司中有n个员工  除了boss  每个员工都有自己的上司  自己下属的下属也是自己的下属  当给一个员工分配任务时  这个员工会把任务也分配到自己的所有下属   每个员工都只做最后一个被分配 ...

  7. HDU 3047 Zjnu Stadium (带权并查集)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=3047 题目: Problem Description In 12th Zhejiang College ...

  8. hdu 1272 小希的迷宫 (并查集)

    小希的迷宫                                                                          Time Limit: 2000/1000 ...

  9. HDU 3081 Marriage Match II【并查集+二分图最大匹配】

    大意:有n个男孩n个女孩,告诉你每个女孩喜欢哪些男孩,又告诉你女孩之间的存在一些朋友关系 一个女孩可以和她喜欢的男孩结婚也可以和她朋友喜欢的男孩结婚, 并且朋友关系可以传递 Once every gi ...

  10. HDU - 5176 The Experience of Love(并查集)

    题目链接:点击查看 题目大意:给出一棵边权树,现在要求任意两点之间:最大权值的边减去最小权值的边之和 题目分析:第一步可以先将公式转换一下:,这样问题就转换为了如何求任意两点之间的最大(最小)权值之和 ...

最新文章

  1. 位置偏移问题 绘制_AutoCAD教程之绘制螺栓连接组合图
  2. SQL SERVER数据库中的数据类型 转
  3. 平均股价的时间序列图形_美股技术分析 神奇的九转序列
  4. python中文读音ndarray-numpy中的ndarray方法和属性详解
  5. php nginx exec kill,彻底杀死nginx并重启
  6. 移动app部分机型无法唤起h5支付宝支付_谜之wxs,uni-app如何用它大幅提升性能
  7. LeetCode 277. 搜寻名人(思维题)
  8. 一文详解 | 开放搜索兼容Elasticsearch做召回引擎
  9. 解决SQLServer事物日志过大的方法
  10. devc c语言调用图片,DevC++中使用EGE图形库
  11. 学完python可以当黑客吗_想当黑客吗?我教你啊!精心整理最简单的黑客入门——PYTHON教程,免费系统又经典...
  12. pdf打印机有什么功能
  13. VS2010的项目配置属性中文对照
  14. 10个小窍门,让你轻松准确搜索(转)
  15. pdf和图像文字识别提取工具
  16. 小米WatchS2和小米WatchS1 区别 哪个值得入手
  17. Unirech阿里云国际站轻量应用服务器简介
  18. 【mysql的设计与优化专题(5)】慢查询详解
  19. 地理距离测算(方法免费共享,经纬度、省份、地级市、港口间距离)
  20. 大锤砸向了阿里巴巴的中台 阿里巴巴还是个快乐的青年吗?———为你讲述阿里巴巴中台建设史

热门文章

  1. ios浏览器微信支付回调页面_iOS微信系列,WKWebview加载H5进行微信支付返回浏览器解决方案!...
  2. kubectl 重启pod_Part4:Pod对象的管理
  3. 【2019杭电多校第一场1004=HDU6581】Vacation(思维+避免超时)
  4. fetch oracle 1007,Oracle 教程 Fetch子句 - 闪电教程JSRUN
  5. java实现kotlin接口_Kotlin 接口与 Java8 新特性接口详解
  6. mysql web聊天_多嘴WEB聊天室基于PHP+MYSQL的中文聊天室
  7. [codeup 2031]To Fill or Not to Fill
  8. 阿里云云计算 37 PolarDB MySQL的连接
  9. 算法:把排好序的链表转换为二叉排序树Convert Sorted List to Binary Search Tree
  10. 算法:回溯八 Combinations指定个数组合