POJ1308——Is It A Tree?
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 22631 | Accepted: 7756 |
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
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
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?的更多相关文章
- poj1308 Is It A Tree?(并查集)详解
poj1308 http://poj.org/problem?id=1308 题目大意:输入若干组测试数据,输入 (-1 -1) 时输入结束.每组测试数据以输入(0 0)为结束标志.然后根据所给的 ...
- POJ1308 Is It A Tree?
题目大意:和HDU1272-小希的迷宫题目一样, 如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径 ...
- 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 ...
- 【转】并查集&MST题集
转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- hdu图论题目分类
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- HDU图论题单
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- Is It A Tree?----poj1308
http://poj.org/problem?id=1308 #include<stdio.h> #include<string.h> #include<iostream ...
随机推荐
- 开源3D游戏引擎Irrlicht简介
Irrlicht简介 Irrlicht在国内也被叫做"鬼火"引擎,是一款用C++编写的开放源代码的高性能游戏引擎.而且是跨平台的,具有很好的移植性,Irrlicht支持OpenGl ...
- javascript 基础篇 随课笔记
!DOCTYPE HTML><html><head><meta name="content-type" content="text/h ...
- mysql源码安装(包括5.5和5.7)
1.mysql5.5源码安装 yum install -y cmake ncurses-devel ncurses cd /usr/src wget -c https://cdn.mysql.com/ ...
- Windows系统的关机、休眠和睡眠状态究的区别
原文:Windows系统的关机.休眠和睡眠状态究的区别 相信有些小伙伴跟我一样,对电脑的一些常用操作或名词不太熟悉,今天我们就简单来聊聊电脑的关机.休眠和睡眠状态究竟有何区别吧! 如果你在电脑左下角的 ...
- 封装TensorFlow神经网络
为了参加今年的软件杯设计大赛,这几个月学习了很多新知识.现在大赛的第二轮作品优化已经提交,开始对这四个月所学知识做一些总结与记录. 用TensorFlow搭建神经网络.TensorFlow将神经网络的 ...
- Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅
通过 Docker 化一个博客网站来开启我们的 Docker 之旅 这篇文章包含 Docker 的基本概念,以及如何通过创建一个定制的 Dockerfile 来 Docker 化Dockerize一个 ...
- Bag标签之中的一个行代码实行中文分词实例3
例3: 分词(返回一个书包.以_0._1._2 ...取出分好的词) <bag id=words act=2words>我喜欢黄色高领T恤衫</bag> 注意没有name属性 ...
- React Native入门——IDE及其它相关基础技术
关于React Native的开发,当中一个问题是缺少好用的IDE,有些人说不就是JS么,搞一个记事本也就写了,那样尽管牛逼,但事实上还是非常头大的,有一款好的IDE还是能提升开发效率的,这里对几个还 ...
- zoj 2778 - Triangular N-Queens Problem
题目:在三角形的棋盘上放n皇后问题. 分析:找规律题目.依照题目的输出,能够看出构造法则: 先填奇数,后填偶数.以下我们仅仅要证明这样的构造的存在性就可以. 解法:先给出集体构造方法,从(1.n-f( ...
- 如何才能正确的关闭Socket连接
从TCP协议角度来看,一个已建立的TCP连接有两种关闭方式,一种是正常关闭,即四次挥手关闭连接:还有一种则是异常关闭,我们通常称之为连接重置(RESET).首先说一下正常关闭时四次挥手的状态变迁,关闭 ...