HDU-1325-Is It A Tree?
来源:互联网 发布:php 私有方法 编辑:程序博客网 时间:2024/05/26 12:08
ACM模版
描述
题解
这道题方法很多,比较好的方法是直接根据树的性质来判断,先判断是否有环,可以通过边数来判断,n个结点最多有n-1条边,不然一定会有环,接着判断根的个数,也就是入度为0的个数,必须为1,最后判断其他根节点入度是否都为1,否则说明不是树!
当然,判断环的部分也可以用并查集,但是这个并查集需要注意些剪枝优化,不然会TLE的,我一开始直接拿着小希的迷宫的代码改了一行提交,TLE了两次……怪我太天真了。
代码
#include <stdio.h>const int MAXN = 100010;typedef struct{ int num, root, conn; // 数据、根、入度} Node;int NodeNum;Node node[MAXN];void init(){ NodeNum = 0; for (int i = 0; i < MAXN; i++) { node[i].conn = 0; // 入度初始化为0 node[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 (n > NodeNum) { NodeNum = n; } if (m > NodeNum) { NodeNum = m; } if (!flag && n != 0 && n != 0) { continue; // 已经确定不是树了,就继续循环 } if (n == 0 && m == 0) { int root_num = 0; for (int j = 1; j <= NodeNum;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;}
参考
HDU 1272 小希的迷宫
0 0
- HDU 1325 Is It a Tree?
- hdu 1325 Is It A Tree?
- hdu 1325 Is It A Tree?
- hdu 1325 Is It A Tree?
- hdu 1325 Is It A Tree?
- hdu 1325 Is It A Tree?
- hdu 1325 is it a tree?
- HDU-1325-Is It A Tree?
- HDU 1325 Is It A Tree? ---树
- HDU 1325 Is It A Tree?
- hdu 1325 Is It A Tree?
- hdu 1325 Is It A Tree?
- hdu 1325 Is it a tree
- hdu 1325 &&poj1308 Is It A Tree?
- HDU 1325 Is It A Tree?
- HDU 1325 Is It A Tree?
- HDU 1325 Is It A Tree?
- hdu 1325 is it a tree?
- HDU 1285 确定比赛名次(拓扑排序)
- IndexDB数据库操作指南
- 和为定值得多个数的递归求解算法
- 如何查看电脑的GPU型号
- android.support.v7.widget.RecyclerView的使用
- HDU-1325-Is It A Tree?
- Java的集合框架
- Word 写文档时使域背景为灰色以便清晰显示
- 【51单片机学习过程记录】14 中断之串口中断的应用1(查询方式)
- StringBuffer.reverse()中surrogate pair的问题
- LeetCode总结,二分法一般性总结
- dev 根据值改变行颜色
- SQL左连接判断空值
- 平衡二叉树-旋转