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. commons-fileupload 多文件上传

    第三方的文件上传工具类,例如这个东东:http://www.oschina.net/p/commons-fileupload,解析的方法无非就是这样: 1:在 controller 中先 HttpSe ...

  2. vue的钩子函数

    1.computed 计算属性 计算属性将被混入到 Vue 实例中.所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 1..aPlus: { get: function ...

  3. P3507 [POI2010]GRA-The Minima Game

    题目描述 Alice and Bob learned the minima game, which they like very much, recently. The rules of the ga ...

  4. HTTP 各种特性应用(一)

    一. CORS 预请求 允许方法: GET. HEAD. POST 这三个方法 不需要预请求. 允许 Content-Type text/plain. multipart/form-data. app ...

  5. Python协程一点理解

    协程,又称微线程,纤程.英文名Coroutine. 线程是系统级别的它们由操作系统调度,而协程则是程序级别的由程序根据需要自己调度.在一个线程中会有很多函数,我们把这些函数称为子程序,在子程序执行过程 ...

  6. Mysql学习总结(11)——MySql存储过程与函数

    摘要:存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程和函数可以避免开发人员重复的编写相同的SQL语句.而且,存储过程和函数是在 ...

  7. spring在web.xml中的配置

    在实际项目中spring的配置文件applicationcontext.xml是通过spring提供的加载机制,自动加载的容器中去,在web项目中,配置文件加载到web容器中进行解析,目前,sprin ...

  8. Swift之 vm10虚拟机安装Mac OS X10.10教程

    VM10装Mac OS X 10.9.3及更新到Mac OS X 10.10,让你的windows也能玩Swift .   近期WWDC放出终极大招--新的编程语言Swift(雨燕),导致一大波程序猿 ...

  9. poi excel自己主动转换成javabean 支持引用类型属性二级转换

    近期项目须要使用excel导入功能.导入学生的时候须要指定所在班级,使用excel一次性导入! 将曾经的代码改改支持属性内引用类的转换. 測试对象为User对象,javabean结构: private ...

  10. C# 使用 X.509 v.3 证书的方法。

    C# 使用 X.509 v.3 证书的方法. public static void Main()    { // The path to the certificate.        string ...