题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1325

题意是每次输入一对数字n,m表示一条树边,并且n是m的父亲,直到n==0&&m==0,表示这一组数据结束输入,当某组数据第一条边n,m都是-1时结束程序,我表达不太行。

我们要判断每一组数据输入的这些边是不是可以构成一棵树。

首先如果这时一棵树,我们可以知道它的一些性质,比如:

除了根节点入度为0,其他点的入度都为1。

边的数目加1等于点的数目

树上的点是两两连通的。

那么我们只需要记录每个点的入度(是不是大于1),记录边数和点数,最后判断这是不是一棵树(连通),而不是森林。

这里需要注意空树也是树。

我的代码写的有点low:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. #include<map>
  6. #include<stack>
  7. #include<cmath>
  8. #include<vector>
  9. #include<set>
  10. #include<cstdio>
  11. #include<string>
  12. #include<deque>
  13. using namespace std;
  14. typedef long long LL;
  15. #define eps 1e-8
  16. #define INF 0x3f3f3f3f
  17. #define maxn 100005
  18. /*struct point{
  19. int u,w;
  20. };
  21. bool operator <(const point &s1,const point &s2)
  22. {
  23. if(s1.w!=s2.w)
  24. return s1.w>s2.w;
  25. else
  26. return s1.u>s2.u;
  27. }*/
  28. bool vis[maxn];
  29. int pre[maxn],in[maxn];
  30. int n,m,k,t;
  31. int edge_num,point_num,flag,digit;//digit在这里是随便记录一个树上面的点,后面好判断连通
  32. void init()
  33. {
  34. for(int i=;i<maxn;i++)
  35. pre[i]=i;
  36. memset(vis,false,sizeof(vis));
  37. memset(in,,sizeof(in));
  38. edge_num=point_num=;
  39. flag=;
  40. }
  41. int find(int a)//找祖先节点
  42. {
  43. if(pre[a]==a)
  44. return a;
  45. return pre[a]=find(pre[a]);
  46. }
  47. void combine(int a,int b)//连接两个集合
  48. {
  49. int x=find(a);
  50. int y=find(b);
  51. if(x!=y)
  52. pre[x]=y;
  53. }
  54. void addedge(int a,int b)//添加边
  55. {
  56. if(!vis[a])
  57. {
  58. digit=a;
  59. vis[a]=true;
  60. point_num++;
  61. }
  62. if(!vis[b])
  63. {
  64. vis[b]=true;
  65. point_num++;
  66. }
  67. edge_num++;//边加
  68. in[b]++;//入度加
  69. if(in[b]>)
  70. flag=;
  71. combine(a,b);
  72. }
  73. int jug()//判断是否是数
  74. {
  75. if(flag)
  76. return false;
  77. if(edge_num+!=point_num)
  78. return false;
  79. for(int i=;i<maxn;i++)
  80. {
  81. if(vis[i]&&find(digit)!=find(i))
  82. return false;
  83. }
  84. return true;
  85. }
  86. int main()
  87. {
  88. int num=;
  89. while(scanf("%d%d",&n,&m))
  90. {
  91. if(n<||m<)
  92. break;
  93. if(n==&&m==)//特殊情况,空树
  94. {
  95. printf("Case %d is a tree.\n",++num);
  96. continue;
  97. }
  98. init();
  99. addedge(n,m);
  100. while(scanf("%d%d",&n,&m))
  101. {
  102. if(n==&&m==)
  103. break;
  104. addedge(n,m);
  105. }
  106. if(jug())
  107. printf("Case %d is a tree.\n",++num);
  108. else
  109. printf("Case %d is not a tree.\n",++num);
  110. }
  111. return ;
  112. }

并查集和树的一些性质 hdu1325的更多相关文章

  1. BZOJ3211 花神游历各国 并查集 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3211 题意概括 有n个数形成一个序列. m次操作. 有两种,分别是: 1. 区间开根(取整) 2. ...

  2. HDU 1116 Play on Words(并查集和欧拉回路)(有向图的欧拉回路)

    Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  3. LeetCode刷题总结-排序、并查集和图篇

    本文介绍LeetCode上有关排序.并查集和图的算法题,推荐刷题总数为15道.具体考点分析如下图: 一.排序 1.数组问题 题号:164. 最大间距,难度困难 题号:324. 摆动排序 II,难度中等 ...

  4. 22.1.22 并查集和KMP算法

    22.1.22 并查集和KMP算法 1.并查集结构 1)实现: 并查集有多种实现方式,例如向上指的图的方式,数组的方式等等.其根本思想就在于准确记录某个节点的根节点,这个这种记录就能够很快的实现并查集 ...

  5. BZOJ-3211花神游历各国 并查集+树状数组

    一开始想写线段树区间开方,简单暴力下,但觉得变成复杂度稍高,懒惰了,编了个复杂度简单的 3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Subm ...

  6. 51 nod 1427 文明 (并查集 + 树的直径)

    1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...

  7. 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树

    正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...

  8. 无限极分类php实现—查子孙树、家谱树

    1.本文更新日期:2018/05/20 , 亲测可用,在原有基础上进行增强和 详细化 . 2.面包屑导航 和 子孙树 效果图如下: 3.代码: <?php // 无限级分类中,查家谱树(面包屑导 ...

  9. hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)

    hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...

随机推荐

  1. ubuntu 上 SSH scp 技巧

    参考:https://deepzz.com/post/how-to-setup-ssh-config.html SSH(Secure Shell)是什么?是一项创建在应用层和传输层基础上的安全协议,为 ...

  2. DDD随笔-Axon

    1. 命令处理程序从存储库中检索域对象(聚合)并执行它们的方法来更改它们的状态.这些聚合通常包含实际的业务逻辑,因此负责维护自己的状态.聚合的状态变化导致产生领域事件.领域事件和聚合形成领域模型. 2 ...

  3. TP5 模型事务操作

    注意:数据只要涉及多表一致性操作,必须要开启数据库事务操作 ThinkPHP5 中模型层中使用事务: try{ $this->startTrans(); $this->data($orde ...

  4. VSFTP 服务器配置

    解决root用户无法登陆ftp传输文件的问题 配置vsftpd用户,启用root用户.  #cd /etc/vsftpd #vi ftpusers  注释掉root  修改user_list文件  # ...

  5. 机器学习进阶-图像特征harris-角点检测 1.cv2.cornerHarris(进行角点检测)

    1.cv2.cornerHarris(gray, 2, 3, 0.04)  # 找出图像中的角点 参数说明:gray表示输入的灰度图,2表示进行角点移动的卷积框,3表示后续进行梯度计算的sobel算子 ...

  6. Xe7 System.Json解析数据格式

    一.Demo一 解析嵌套数组 Json数据 {"code":1,"msg":"","data":{"Grade ...

  7. web前端安全的三个关键点

    一.浏览器的同源策略 同源策略:不同域的客户端脚本在未经授权的情况下不能读写对方的资源. 这里有几个关键词:域.脚本.授权.读写.资源 1.同域要求两个站点:同协议.同域名.同端口.下表展示了所列站点 ...

  8. Python 数据结构基本操作

    数据结构是用来存储数据的逻辑结构,合理使用数据结构才能编写出优秀的代码.本文主要介绍Python提供的几种内置数据结构,包括元组.列表.字典的定义和基本操作方法以及介绍典型函数的使用方法. 元组结构 ...

  9. Oracle数据文件迁移到裸设备

    本文主要描述如何将Oracle表空间的文件系统形式的数据文件迁移到LV裸设备上. 前提条件 1.oracle运行正常. 2.已使用LVM命令规划好LV文件.如/dev/vgoracle/lvdatat ...

  10. java实现excel表格导出

    Java 实现导出excel表 POI 1.首先下载poi-3.6-20091214.jar,下载地址如下: http://download.csdn.net/detail/evangel_z/389 ...