POJ 1308 Is It A Tree? 解题报告
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 32052 | Accepted: 10876 |
Description
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 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
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.
Source
North Central North America 1997
再写一题,顺便巩固一下并查集基础,poj1182还没想好,先写了这题吧
题解:这道题的意思是判断给定的边是否构成一颗树,注意不能是森林,我这里用的并查集的方法,每次输入x,y两个点就合并x,y,但是在处理判断是否为森林时感觉处理的不好,我是逐个判断是不是有相同的父亲结点来处理的,感觉优化的不是很好,好在AC了。
#include <iostream>
#include <cstdio>
#include <vector> const int maxn = 1e6+7; using namespace std; int father[maxn], n; void init()
{
for (int i=0; i<=maxn; i++)
father[i] = i;
} int fi(int x)
{
return x == father[x] ? x : father[x] = fi(father[x]);
} void unite(int x, int y)
{
int p1 = fi(x), p2 = fi(y);
if (p1 == p2) return;
father[p1] = p2;
} int same(int x, int y)
{
int p1 = fi(x), p2 = fi(y);
if (p1 == p2)
return 1;
return 0;
} int main()
{
int a, b;
int c = 1;
vector<int> v;
init();bool judge = true;
while (~scanf("%d%d", &a, &b))
{
if (a == -1 && b == -1) break;
if (a == 0 && b == 0) {
for (int i=0; i<v.size(); i++) {
for (int j=i+1; j<v.size(); j++) {//判断是否构成森林
if (i != j && v[i] != v[j] && !same(v[i], v[j])) {
judge = false;
break;
}
}
if (!judge) break;
}
if (judge)
printf("Case %d is a tree.\n", c);
else
printf("Case %d is not a tree.\n", c);
c++;
init();
v.clear();
judge = true;
}else {
v.push_back(a);
v.push_back(b);
if (!same(a, b)) //判断是否构成回路或者环
unite(a, b);
else {
judge = false;
}
}
}
return 0;
}
POJ 1308 Is It A Tree? 解题报告的更多相关文章
- POJ 1308 Is It A Tree?--题解报告
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 31092 Accepted: 10549 D ...
- 【LeetCode】863. All Nodes Distance K in Binary Tree 解题报告(Python)
[LeetCode]863. All Nodes Distance K in Binary Tree 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...
- 【LeetCode】297. Serialize and Deserialize Binary Tree 解题报告(Python)
[LeetCode]297. Serialize and Deserialize Binary Tree 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode ...
- 【LeetCode】331. Verify Preorder Serialization of a Binary Tree 解题报告(Python)
[LeetCode]331. Verify Preorder Serialization of a Binary Tree 解题报告(Python) 标签: LeetCode 题目地址:https:/ ...
- 【LeetCode】109. Convert Sorted List to Binary Search Tree 解题报告(Python)
[LeetCode]109. Convert Sorted List to Binary Search Tree 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id ...
- 【LeetCode】236. Lowest Common Ancestor of a Binary Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】99. Recover Binary Search Tree 解题报告(Python)
[LeetCode]99. Recover Binary Search Tree 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/p ...
- 【LeetCode】662. Maximum Width of Binary Tree 解题报告(Python)
[LeetCode]662. Maximum Width of Binary Tree 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.co ...
- 【LeetCode】623. Add One Row to Tree 解题报告(Python)
[LeetCode]623. Add One Row to Tree 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problem ...
随机推荐
- PHP加密解密的函数
<?php class Encryption { /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function encrypt($str,$key){ / ...
- Intellij IDEA查看方法的调用栈
在IDEA中,先双击选定要查看的方法,使用快捷键Ctrl+Alt+h,在右侧就会显示该方法的详细信息,再双击右侧的方法,就定位到方法的代码区.如下图:
- Example018主页加载时获取焦点
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Socket实现-Socket I/O
Socket层的核心是两个函数:sosend()和soreceive().这两个函数负责处理所有Socket层和协议层之间的I/O操作. select()系统调用的作用是监控文件描述符的状态.一般用于 ...
- VMware中Mac OS中显示共享文件夹的方法
在finder 偏好设置里的通用标签下,勾选 “已连接的服务器”
- 超好用的memcache管理及可视化监控工具,真方便!
memcache做为主流的缓存数据库之一,广泛在各互联网平台使用,但是大家使用中都知道memcache目前没有一个比较好用的可视化客户端工具,每次都要输入命令进行操作,十分不方便. 而另一款主流缓存 ...
- 怎样把echarts图表做成响应式的
如果想要把echarts图表给做成响应式的那么就应该用rem 单位,给图表的外围容器设置rem 单位,然后调用jquery 的resize方法,$(window).resize(function(){ ...
- javascript 实现 对XML文件 2级/3级联动操作
js代码 //实现对xml文档的读取:function loadXMLDoc(dname) { try // Internet Explorer { xmlDoc = new ActiveXObjec ...
- 动态数组ArrayList的使用
1.定义类 package com.realhope.rmeal.bean; /** * * @author Wucy * 菜谱类 */ public class Menu{ private Inte ...
- Java基础语法<十一> 异常 断言 日志 调试
1 处理错误 1.1 异常分类 Error类层次描述了Java运行时系统的内部错误和资源耗尽错误. 设计Java程序时,主要关注Exception层次结构. 由程序错误导致的异常属于RuntimeEx ...