题目链接 poj hdu

Is It A Tree?

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 421 Accepted Submission(s): 157

Problem Description

A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties.
There is exactly one node, called the root, to which no directed edges point.

Every node except the root has exactly one edge pointing to it.

There is a unique sequence of directed edges from the root to each node.

For example, consider the illustrations below, in which nodes are represented by circles and edges are represented by lines with arrowheads. The first two of these are trees, but the last is not.

In this problem you will be given several descriptions of collections of nodes connected by directed edges. For each of these you are to determine if the collection satisfies the definition of a tree or not.

Input

The input will consist of a sequence of descriptions (test cases) followed by a pair of negative integers. Each test case will consist of a sequence of edge descriptions followed by a pair of zeroes Each edge description will consist of a pair of integers; the first integer identifies the node from which the edge begins, and the second integer identifies the node to which the edge is directed. Node numbers will always be greater than zero.

Output
For each test case display the line Case k is a tree.\\\\\\\" or the lineCase k is not a tree.\\\\”, where k corresponds to the test case number (they are sequentially numbered starting with 1).

Sample Input

6 8 5 3 5 2 6 4
5 6 0 0

8 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 0

3 8 6 8 6 4
5 3 5 6 5 2 0 0

-1 -1

Sample Output

Case 1 is a tree.
Case 2 is a tree.
Case 3 is not a tree.


程序分析(转载):

  这道题跟小希的迷宫有很大的相似吧,只是一个是无向图一个是有向图。也是给你那些结点之间的信息,然后让你判断是不是一颗树罢了,用树的定义来 判断吧,无环,n个结点最多有n-1条边,不然就会有环。只有一个入度为0的结点,不存在入度大于1的结点。这些也足以判断是否为一棵树了吧。不过要注意 一些特殊数据的情况,空树也是树。比如输入0 0。

解决方法:

  其实也可以不用并查集,这样就可以直接按照上面的条件来统计,就可以判断是不是一颗树了。

自我感言:额,这道题目关键就是判断树的那几个标准,1,无环;2,除了根,所有的入度为1,根入度为0;3,这个结构只有一个根,不然是森林了。

这是三个标准拿捏好,再注意这里空树也是树。基本上就ok了。。

坑爹的是下边的代码可以在hdu上通过,而不能在poj上通过。。。。。看了discuss才知道 1 1 0 0 不能是树。

下面几种情况要注意了。。。。
1: 0 0 空树是一棵树
2: 1 1 0 0 不是树 不能自己指向自己
3: 1 2 1 2 0 0 不是树….自己开始一直在这么WA 好郁闷 重复都不行呀~~5555
4: 1 2 2 3 4 5 不是树 森林不算是树(主要是注意自己)
5: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 注意 一个节点在指向自己的父亲或祖先 都是错误的 即 9–>1 错
6: 1 2 2 1 0 0 也是错误的这样基本上就可以在poj上通过了,poj(1308) 题这是hdu上通过的代码:

#include <stdio.h>const int max_num = 100000+10;
typedef struct
{int num,root,conn;//数据、根、入度
}Node;Node node[max_num];void init()
{for(int i = 0; i < max_num; i++){node[i].conn = 0;//入度初始化为0node[i].root= i;//根记录为自身node[i].num=0;//标记数字是否被使用过,0:没有被使用过,1:使用过了}
}int find_root(int a)
{if(node[a].root!=a)return node[a].root = find_root(node[a].root);return node[a].root;
}void union_set(int a,int b)
{a = find_root(a);b = find_root(b);if(a==b)//同一个根,说明是在同一个树下return;node[b].root=a;//把b的根赋为a的根,此时a已经是根,num==root
}int main()
{int n,m;int i = 1;bool flag=true;//true:是个树,false:不是树init();while(scanf("%d%d",&n,&m)!=EOF&&n>=0&&m>=0){if(!flag&&n!=0&&n!=0)continue;//已经确定不是树了,就继续循环if(n==0&&m==0){int root_num=0;for(int j = 1; j < max_num;j++){//判断是否为森林,如果,root_num用来记录根的数目if(node[j].num && find_root(j)==j)root_num++;if(node[j].conn>1)//如果出现某个节点的入度超过1,不是树{flag = false;break;}}if(root_num>1)//连通分支大于1,是森林不是树flag=false;if(flag)printf("Case %d is a tree.\n",i++);else printf("Case %d is not a tree.\n",i++);flag = true;init();continue;}if(m!=n&&find_root(n)==find_root(m))flag = false;else{//将m,n,记录为节点node[m].num = 1;node[n].num = 1;node[m].conn++;//入度增加一union_set(n,m);}}return 0;
} 

中间只是稍作修改,把if(m!=n&&find_root(n)==find_root(m))改成了if((m!=n&&find_root(n)==find_root(m))||m==n)就在poj上通过了

#include <stdio.h>const int max_num = 100000+10;
typedef struct
{int num,root,conn;//数据、根、入度
}Node;Node node[max_num];void init()
{for(int i = 0; i < max_num; i++){node[i].conn = 0;//入度初始化为0node[i].root= i;//根记录为自身node[i].num=0;//标记数字是否被使用过,0:没有被使用过,1:使用过了}
}int find_root(int a)
{if(node[a].root!=a)return node[a].root = find_root(node[a].root);return node[a].root;
}void union_set(int a,int b)
{a = find_root(a);b = find_root(b);if(a==b)//同一个根,说明是在同一个树下return;node[b].root=a;//把b的根赋为a的根,此时a已经是根,num==root
}int main()
{int n,m;int i = 1;bool flag=true;//true:是个树,false:不是树init();while(scanf("%d%d",&n,&m)!=EOF&&n>=0&&m>=0){if(!flag&&n!=0&&n!=0)continue;//已经确定不是树了,就继续循环if(n==0&&m==0){int root_num=0;for(int j = 1; j < max_num;j++){//判断是否为森林,如果,root_num用来记录根的数目if(node[j].num && find_root(j)==j)root_num++;if(node[j].conn>1)//如果出现某个节点的入度超过1,不是树{flag = false;break;}}if(root_num>1)//连通分支大于1,是森林不是树flag=false;if(flag)printf("Case %d is a tree.\n",i++);else printf("Case %d is not a tree.\n",i++);flag = true;init();continue;}if((m!=n&&find_root(n)==find_root(m))||m==n)flag = false;else{//将m,n,记录为节点node[m].num = 1;node[n].num = 1;node[m].conn++;//入度增加一union_set(n,m);}}return 0;
}

HDU 1325POJ 1308 Is it A tree ? [并查集+树判定]相关推荐

  1. HDU 5606 tree 并查集

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

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

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

  3. HDU(1856),裸的带权并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856 题意:朋友圈问题,A和B是朋友,B和C是朋友则A和C也是朋友,依次类推,题目的意思就是求最大的朋 ...

  4. hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1233 模板题,kruskal求最小生成树. 并查集是个好东西啊  就是注意一点 输入边的信息时,角标 ...

  5. 【HDU - 4056】Draw a Mess (并查集 or 线段树)

    题干: It's graduated season, every students should leave something on the wall, so....they draw a lot ...

  6. hdu 3635 Dragon Balls 龙珠 带权并查集

    每次移动都是一个群龙珠移动到另一群龙珠所在的城市里面.所以这两个城市之间都不会空. 用并查集表示,每一个祖先节点的序号和他们所在城市的序号相同. 无论路径如何压缩,子结点的移动次数=父节点的移动次数+ ...

  7. hdu 1325poj 1308 并查集(未解决)(掌握率50%)

    http://acm.hdu.edu.cn/showproblem.php?pid=1325 留个坑,超级大坑题 转载于:https://www.cnblogs.com/ccccnzb/p/38356 ...

  8. HDU Problem 1272 小希的迷宫 【并查集】

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  9. hdu 1598 find the most comfortable road (并查集+枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000/ ...

最新文章

  1. Android开发必看知识,不看后悔
  2. 禁止用户复制网页的内容
  3. [luoguP2896] [USACO08FEB]一起吃饭Eating Together(DP)
  4. 【小白学PyTorch】1.搭建一个超简单的网络
  5. Kibana安装配置
  6. mysql索引是自动使用吗_mysql索引是自动使用吗?
  7. 模拟驾驶能力输出,赋能客户提升稳定性信心
  8. Ant-design-vue定制主题色
  9. 【leetcode】940. Distinct Subsequences II
  10. Redis-03-Redis集群的搭建
  11. matlab中grid的用法
  12. 线性代数————思维导图(上岸必备)(相似理论)
  13. 用Python分析44万条数据,揭秘如何成为网易云音乐评论区的网红段子手
  14. 【EXLIBRIS】#小词旮旯# 000 初衷
  15. java多线程贪吃蛇实验报告_JAVA开放性实验报告贪吃蛇
  16. css浏览器兼容性的问题
  17. 德不配位,必有灾殃(我整整读了五遍,太透彻了!)
  18. 流浪地球2真实成本多少?怎么参与?找谁参与?安全可靠吗?
  19. android源码结构分析
  20. 宇宙的电网模型之太阳实验起源谭

热门文章

  1. 小米新一代大数据统计平台大公开
  2. windows 配置FTP教程
  3. php mysql高校教材管理系统
  4. 自定义C语言CVector
  5. 2023年第十五届华中杯赛题A题详细版思路 新型镇静药物临床实验疗效分析与预测
  6. Windows下摄像头采集驱动(DirectShow)
  7. FRDM-KL43开发板驱动段式液晶SLCD的实现方法
  8. submit方法与onsubmit事件
  9. 一篇文章教会你利用Python网络爬虫获取分类图片
  10. 4个案例,教会你Python处理时间数据频率转换