Is It A Tree?

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 22631   Accepted: 7756

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 line "Case 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.

Source

推断一些点形成的结构是否是一棵树。坑点好多,用并查集推断连通支数以及环,推断每一个点的入度。推断是否有自己连向自己的边

#include <map>
#include <set>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int father[100010];
bool vis[100010];
int in_deg[100010]; int find(int x)
{
if (father[x] == -1)
{
return x;
}
return father[x] = find(father[x]);
} void init()
{
memset( father, -1, sizeof(father));
memset( vis, 0, sizeof(vis));
memset(in_deg, 0, sizeof(in_deg));
} int main()
{
int x, y;
int icase = 1;
while (~scanf("%d%d", &x, &y))
{
if (x == -1 && y == -1)
{
break;
}
if (x == 0 && y == 0)
{
printf("Case %d is a tree.\n", icase++);
continue;
}
init();
map<int, int> bianhao;
bianhao.clear();
int cnt = 0;
bool flag = true;
while (x && y)
{
if (!x && !y)
{
break;
}
if (x == y)
{
flag = false;
}
if (flag && !vis[x])
{
vis[x] = 1;
bianhao[x] = ++cnt;
}
if (flag && !vis[y])
{
vis[y] = 1;
bianhao[y] = ++cnt;
}
if (flag)
{
int a = find(bianhao[x]);
int b = find(bianhao[y]);
if (a == b)
{
flag = false;
}
father[a] = b;
in_deg[bianhao[y]]++;
}
scanf("%d%d", &x, &y);
}
if (!flag)
{
printf("Case %d is not a tree.\n", icase++);
continue;
}
int ans = 0;
// for (int i = 1; i <= cnt; ++i)
// {
// printf("%d ", in_deg[i]);
// }
for (int i = 1; i <= cnt; ++i)
{
if (in_deg[i] == 0)
{
ans++;
}
if (ans >= 2)
{
break;
}
if (in_deg[i] >= 2)
{
flag = false;
break;
}
}
if (ans >= 2 || !flag)
{
printf("Case %d is not a tree.\n", icase++);
continue;
}
printf("Case %d is a tree.\n", icase++);
}
return 0;
}

POJ1308——Is It A Tree?的更多相关文章

  1. poj1308 Is It A Tree?(并查集)详解

    poj1308   http://poj.org/problem?id=1308 题目大意:输入若干组测试数据,输入 (-1 -1) 时输入结束.每组测试数据以输入(0 0)为结束标志.然后根据所给的 ...

  2. POJ1308 Is It A Tree?

    题目大意:和HDU1272-小希的迷宫题目一样, 如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径 ...

  3. POJ-1308 Is It A Tree?(并查集判断是否是树)

    http://poj.org/problem?id=1308 Description A tree is a well-known data structure that is either empt ...

  4. 【转】并查集&MST题集

    转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...

  5. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  6. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  7. hdu图论题目分类

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  8. HDU图论题单

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  9. Is It A Tree?----poj1308

    http://poj.org/problem?id=1308 #include<stdio.h> #include<string.h> #include<iostream ...

随机推荐

  1. jQuery中四种事件监听的区别

    原文链接:点我 我们知道jquery提供了四种事件监听方式,分别是bind.live.delegate.on,下面就分别对这四种事件监听方式分析. 已知有4个列表元素: 列表元素1 列表元素2 列表元 ...

  2. tensorflow学习之路-----简单卷积神经网路

    import tensorflow as tf#取数据,目的是辨别数字from tensorflow.examples.tutorials.mnist import input_data'''手动添加 ...

  3. 学习推荐《Python神经网络编程》中文版PDF+英文版PDF+源代码

    推荐非常适合入门神经网络编程的一本书<Python神经网络编程>,主要是三部分: 介绍神经网络的基本原理和知识:用Python写一个神经网络训练识别手写数字:对识别手写数字的程序的一些优化 ...

  4. 记一次 Apache HUE 优化之因使用 Python 魔术方法而遇到的坑

    最近的工作是基于 Apache HUE 做二次开发.刚接手 HUE 的代码的时候,内心是崩溃的:开源的代码,风格很多种, 代码比较杂乱; 虽是基于 Django 开发的,但是项目的结构改变很大; 很多 ...

  5. 【Henu ACM Round #13 B】Spider Man

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现每个环可以操作的次数是固定的. (环的大小-1 也就是说一旦环确定了.其实结果就已经确定了. 则直接看操作总数的奇偶性就可以了 ...

  6. 【Uva 12105】Bigger is Better

    [Link]: [Description] 让你用最多n根棍子,组成一个数字,使得它能够被m整除; 数字1..9分别需要用-根棍子. 要求这个数字尽可能地大; 然后输出这个数字. [Solution] ...

  7. Python 值传递和引用传递

    值传递和引用传递 參考地址:http://www.dataguru.cn/thread-489552-1-1.html python的值传递不会改变传入參数的值,而引用传递传入的是一个地址.有点相似c ...

  8. ZOJ 1654 Place the Robots(放置机器人)------最大独立集

    Place the Robots http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1654 Time Limit: 5 Sec ...

  9. js---12数据类型,数据类型转换,NaN,

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  10. 针对CDP协议攻击分析及安全防护

    针对CDP协议攻击分析及安全防护 熟悉Cisco的朋友都知道CDP协议是思科公司独特的发现协议,在思科公司出产的所有路由器和交换机里面都能运行此协议,一台运行C D P的路由器或交换机能够得知与它直接 ...