并查集和树的一些性质 hdu1325
题目链接: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:
- #include<iostream>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- #include<map>
- #include<stack>
- #include<cmath>
- #include<vector>
- #include<set>
- #include<cstdio>
- #include<string>
- #include<deque>
- using namespace std;
- typedef long long LL;
- #define eps 1e-8
- #define INF 0x3f3f3f3f
- #define maxn 100005
- /*struct point{
- int u,w;
- };
- bool operator <(const point &s1,const point &s2)
- {
- if(s1.w!=s2.w)
- return s1.w>s2.w;
- else
- return s1.u>s2.u;
- }*/
- bool vis[maxn];
- int pre[maxn],in[maxn];
- int n,m,k,t;
- int edge_num,point_num,flag,digit;//digit在这里是随便记录一个树上面的点,后面好判断连通
- void init()
- {
- for(int i=;i<maxn;i++)
- pre[i]=i;
- memset(vis,false,sizeof(vis));
- memset(in,,sizeof(in));
- edge_num=point_num=;
- flag=;
- }
- int find(int a)//找祖先节点
- {
- if(pre[a]==a)
- return a;
- return pre[a]=find(pre[a]);
- }
- void combine(int a,int b)//连接两个集合
- {
- int x=find(a);
- int y=find(b);
- if(x!=y)
- pre[x]=y;
- }
- void addedge(int a,int b)//添加边
- {
- if(!vis[a])
- {
- digit=a;
- vis[a]=true;
- point_num++;
- }
- if(!vis[b])
- {
- vis[b]=true;
- point_num++;
- }
- edge_num++;//边加
- in[b]++;//入度加
- if(in[b]>)
- flag=;
- combine(a,b);
- }
- int jug()//判断是否是数
- {
- if(flag)
- return false;
- if(edge_num+!=point_num)
- return false;
- for(int i=;i<maxn;i++)
- {
- if(vis[i]&&find(digit)!=find(i))
- return false;
- }
- return true;
- }
- int main()
- {
- int num=;
- while(scanf("%d%d",&n,&m))
- {
- if(n<||m<)
- break;
- if(n==&&m==)//特殊情况,空树
- {
- printf("Case %d is a tree.\n",++num);
- continue;
- }
- init();
- addedge(n,m);
- while(scanf("%d%d",&n,&m))
- {
- if(n==&&m==)
- break;
- addedge(n,m);
- }
- if(jug())
- printf("Case %d is a tree.\n",++num);
- else
- printf("Case %d is not a tree.\n",++num);
- }
- return ;
- }
并查集和树的一些性质 hdu1325的更多相关文章
- BZOJ3211 花神游历各国 并查集 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3211 题意概括 有n个数形成一个序列. m次操作. 有两种,分别是: 1. 区间开根(取整) 2. ...
- HDU 1116 Play on Words(并查集和欧拉回路)(有向图的欧拉回路)
Play on Words Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- LeetCode刷题总结-排序、并查集和图篇
本文介绍LeetCode上有关排序.并查集和图的算法题,推荐刷题总数为15道.具体考点分析如下图: 一.排序 1.数组问题 题号:164. 最大间距,难度困难 题号:324. 摆动排序 II,难度中等 ...
- 22.1.22 并查集和KMP算法
22.1.22 并查集和KMP算法 1.并查集结构 1)实现: 并查集有多种实现方式,例如向上指的图的方式,数组的方式等等.其根本思想就在于准确记录某个节点的根节点,这个这种记录就能够很快的实现并查集 ...
- BZOJ-3211花神游历各国 并查集+树状数组
一开始想写线段树区间开方,简单暴力下,但觉得变成复杂度稍高,懒惰了,编了个复杂度简单的 3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Subm ...
- 51 nod 1427 文明 (并查集 + 树的直径)
1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...
- 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树
正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...
- 无限极分类php实现—查子孙树、家谱树
1.本文更新日期:2018/05/20 , 亲测可用,在原有基础上进行增强和 详细化 . 2.面包屑导航 和 子孙树 效果图如下: 3.代码: <?php // 无限级分类中,查家谱树(面包屑导 ...
- hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)
hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...
随机推荐
- ubuntu 上 SSH scp 技巧
参考:https://deepzz.com/post/how-to-setup-ssh-config.html SSH(Secure Shell)是什么?是一项创建在应用层和传输层基础上的安全协议,为 ...
- DDD随笔-Axon
1. 命令处理程序从存储库中检索域对象(聚合)并执行它们的方法来更改它们的状态.这些聚合通常包含实际的业务逻辑,因此负责维护自己的状态.聚合的状态变化导致产生领域事件.领域事件和聚合形成领域模型. 2 ...
- TP5 模型事务操作
注意:数据只要涉及多表一致性操作,必须要开启数据库事务操作 ThinkPHP5 中模型层中使用事务: try{ $this->startTrans(); $this->data($orde ...
- VSFTP 服务器配置
解决root用户无法登陆ftp传输文件的问题 配置vsftpd用户,启用root用户. #cd /etc/vsftpd #vi ftpusers 注释掉root 修改user_list文件 # ...
- 机器学习进阶-图像特征harris-角点检测 1.cv2.cornerHarris(进行角点检测)
1.cv2.cornerHarris(gray, 2, 3, 0.04) # 找出图像中的角点 参数说明:gray表示输入的灰度图,2表示进行角点移动的卷积框,3表示后续进行梯度计算的sobel算子 ...
- Xe7 System.Json解析数据格式
一.Demo一 解析嵌套数组 Json数据 {"code":1,"msg":"","data":{"Grade ...
- web前端安全的三个关键点
一.浏览器的同源策略 同源策略:不同域的客户端脚本在未经授权的情况下不能读写对方的资源. 这里有几个关键词:域.脚本.授权.读写.资源 1.同域要求两个站点:同协议.同域名.同端口.下表展示了所列站点 ...
- Python 数据结构基本操作
数据结构是用来存储数据的逻辑结构,合理使用数据结构才能编写出优秀的代码.本文主要介绍Python提供的几种内置数据结构,包括元组.列表.字典的定义和基本操作方法以及介绍典型函数的使用方法. 元组结构 ...
- Oracle数据文件迁移到裸设备
本文主要描述如何将Oracle表空间的文件系统形式的数据文件迁移到LV裸设备上. 前提条件 1.oracle运行正常. 2.已使用LVM命令规划好LV文件.如/dev/vgoracle/lvdatat ...
- java实现excel表格导出
Java 实现导出excel表 POI 1.首先下载poi-3.6-20091214.jar,下载地址如下: http://download.csdn.net/detail/evangel_z/389 ...