HDU 1325 POJ 1308 Is It ATree?(并查集)

http://acm.hdu.edu.cn/showproblem.php?pid=1325

题意:

一个数据结构是一颗"树",它要么是一个空要么是满足下面特性的结构:

1.    只有一个根节点,这儿根节点没有入度.

2.    除了这个根节点其他所有的节点都只有一个入边(指向它的边).

3.    从根节点到任意其他的节点有且仅有一条路

现在给你一颗树的所有有向边,然后问你这个树是不是一颗合法的树.

输入:多组实例,最后以-1,-1结尾.每个实例包含一对对的整数,以0 0 表示结尾.

输出:判断是否构成合法的树.

分析:

仔细分析一下,上面3个条件与下面的两个条件等价:

1.对于所有节点构成的有向图来说  只有1个入度为0且其他节点入度都为1

        2.对于所有边构成的无向图来说      只有1个连通分量

所以我们只需要记录所有出现过的节点的入度数目并且计算最终的连通分量数目就可以判断该图形是否是一个树。

注意下面的特例输入:

0 0  (是树)

以及

1 1, 2 3, 3 4, 4 2, 0 0. (入度不符合要求 且 有两个连通分量且 不是树)

以及

1 5, 2 3, 3 4, 4 2, 0 0. (入度符合要求 但是有两个分量 不是树)

#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
const int maxn=10000+5;int in[maxn];//节点入度
int fa[maxn];
int findset(int x)
{return fa[x]==-1? x: fa[x]=findset(fa[x]);
}
void bind(int u,int v)
{int fu=findset(u);int fv=findset(v);if(fu!=fv){fa[fu]=fv;}
}int main()
{int u,v;int kase=0;while(scanf("%d%d",&u,&v)==2 && u>=0){if(u==0 && v==0){printf("Case %d is a tree.\n",++kase);continue;}memset(fa,-1,sizeof(fa));memset(in,0,sizeof(in));set<int> st;do{st.insert(u);st.insert(v);++in[v];bind(u,v);}while(scanf("%d%d",&u,&v)==2 && u>0 );int cnt=0;//连通分量数int root=0;//入度为0的点的数目int num=0;//入读>=2点的数目for(set<int>::iterator it=st.begin(); it!=st.end(); it++){if(*it == findset(*it) ) ++cnt;if(in[*it]==0) ++root;else if(in[*it]>=2) ++num;}if(root==1 && cnt==1 && num==0) printf("Case %d is a tree.\n",++kase);else printf("Case %d is not a tree.\n",++kase);}return 0;
}

统计有几个连通分量的另一种方法--hdu 1325相关推荐

  1. 统计内表行数常用的三种方法

    以下是统计内表行数常用的三种方法, 如下:   1.LOOP AT it_itab.    g_lines2 = g_lines2 + 1.    ENDLOOP.    该方法是通过循环内部表自己累 ...

  2. 用函数统计各分数段人数c语言,如何使用Excel函数统计各或分数段的人数(五种方法).doc...

    Excel教程:妙用Excel五个函数统计学生期末考试分数段 考试结束,老师们都要对学生的考试成绩进行分析.各分数段人数的统计是其中一项必做的工作.在Excel中,怎样快速准确地统计分数段人数呢?以下 ...

  3. Python统计字符/单词/汉字个数(字典)的三种方法

    1.利用字典和列表表达式统计英文单词个数 sentence="""Travel policies for this year's Spring Festival, whi ...

  4. linux 统计日志数量总,shell统计日志中时间段内匹配的数量的方法

    shell统计日志中时间段内匹配的数量的方法,有需要的朋友可以参考下. 假设日志文件mtasvr.log格式如下: T:24583088(04:02:06)[root:Info] 6KqowLDLAg ...

  5. python整数二进制有多少个1_几种统计一个二进制数内有几个1的方法

    几种统计一个二进制数内有几个1的方法 方法一: int f1(int temp) { int num = 0; while(temp) { int t = temp%2; if(t == 1 || t ...

  6. php js统计链接点击次数,JS实现在线统计一个页面内鼠标点击次数的方法

    本文实例讲述了JS实现在线统计一个页面内鼠标点击次数的方法.分享给大家供大家参考.具体实现方法如下: js记录鼠标的点击次数 function addCookie(name,cookievalue,t ...

  7. python统计单词频率、存放在字典中_Python3实现统计单词表中每个字母出现频率的方法示例...

    本文实例讲述了Python3实现统计单词表中每个字母出现频率的方法.分享给大家供大家参考,具体如下: 作为python字典与数组概念的运用,统计字母表中每个字母出现的频率,作为练习再合适不过. 解决问 ...

  8. python中列表用某个数字出现的次数_Python实现统计给定列表中指定数字出现次数的方法...

    本文实例讲述了Python实现统计给定列表中指定数字出现次数的方法.分享给大家供大家参考,具体如下: 直接看实现: #!usr/bin/env python #encoding:utf-8 ''''' ...

  9. python中统计计数的几种方法

    以下实例展示了 count() 方法的使用方法: T = (123, 'Google', 'Runoob', 'Taobao', 123);print ("123 元素个数 : " ...

最新文章

  1. 如何从从工程师跨步管理者,微博信息安全总经理手把手教你企业安全体系建设...
  2. 三、6Gbps SAS冲锋队——Cheetah 15K.7、NS.2
  3. 风投报告:2017下半年VR/AR娱乐领域投资额同比上升79% 【52翻译】
  4. 你以为没有CAD的前辈们画不出复杂的图纸?
  5. 阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器
  6. sap中二级品报工问题解决方案
  7. 测试驱动开发 测试前移_测试驱动开发:它是什么,什么不是。
  8. Python3 —— 列表
  9. C++11新宠-Lambda函数学习
  10. Android8.1 swap空间不够编译失败:ckati failed with: signal: interrupt
  11. MyEclipse 10.5与ExtJS 4.1.1自动代码提示
  12. 不加群提取群成员_QQ群排名优化技术教程
  13. Peekaboo——代码规范、冲刺任务与计划
  14. Css、less和Sass(SCSS)的区别
  15. 让我们用 Node.js 写自己的 DDNS 动态域名程序
  16. 【技术类】ArcGIS里做影像分幅裁剪
  17. 蓝牙连接音箱抓空包、HCI、sitalog
  18. JAVA获取tomcat信息
  19. vue中手机端点击手机键盘的完成 / 搜索按钮触发文本框搜索
  20. 远程办公软件,帮助你解决更多办公烦恼

热门文章

  1. sdk manager的列表怎么消失了_腾讯安全SDK的Dll Dump研究
  2. 想自学python看哪位的视频比较好-Python入门视频看哪个好?适合初学者的教学视频推荐...
  3. 自学python需要安装什么-初学 Python 需要安装哪些软件?
  4. python编程是干嘛的-学 Python 都用来干嘛的?
  5. 免费python课程排行榜-用python爬取2017年中国最好大学排名
  6. win7系统启用与配置语音识别功能的操作方法
  7. ibm语音识别输入系统
  8. linux gpio信号量,执行完? OSIntExit(); 后,再进行任务调度,可是那两个任务都是在等待信号量啊,难道执行完中断函数后会释放一个信号量吗?...
  9. java8 foreach 伟参_【java8】为java8的foreach正名
  10. 【链表】剑指offer:反转链表