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 ...
随机推荐
- HUE配置文件hue.ini 的filebrowser模块详解(图文详解)(分HA集群和非HA集群)
不多说,直接上干货! 我的集群机器情况是 bigdatamaster(192.168.80.10).bigdataslave1(192.168.80.11)和bigdataslave2(192.168 ...
- SQL中union union all 和in的查询效率问题
UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复 1.UNION 的语法如下: [SQL 语句 1] UNION [SQL 语句 ...
- 2008R2域控环境中 应用组策略 实现禁用USB设备使用
本文介绍如何在Windows Server 2008 AD中禁用客户端USB端口.本文使用的系统:Windows Server 2008 R2 企业版.域功能级别:Windows Server 200 ...
- Windows10 Linux子系统的启用和中文用户名的修改
一直用的虚拟机Linux,忽然心血来潮,看到Windows 10可以使用Linux子系统,于是来装一波,按照这位前辈的教程 https://blog.csdn.net/zhangdongren/art ...
- mysql索引工作原理、分类
一.概述 在mysql中,索引(index)又叫键(key),它是存储引擎用于快速找到所需记录的一种数据结构.在越来越大的表中,索引是对查询性能优化最有效的手段,索引对性能影响非常关键.另外,mysq ...
- tcpg通信
1.客户端 from socket import * def main(): # 创建套接字 tcp_socket = socket(AF_INET,SOCK_STREAM) # 链接服务端 ip = ...
- C# 调用者信息特性(Attribute)
.NET 4.5中引用了三种特性(Attribute), 该特性允许获取调用者的当前编译器的执行文件名.所在行数与方法或属性名称. 命名空间 System.Runtime.CompilerServic ...
- qt程序实现打开文件夹
QString path=QDir::currentPath();//获取程序当前目录 path.replace("/","\\");//将地址中的" ...
- new方法的实现原理
// // main.m // 04-new方法的实现原理 #import <Foundation/Foundation.h> #import "Person.h" # ...
- QQ互联账号登录
本文说明的是依据某应用通过网页的qq信息来登录的过程.用途是利用QQ账号就能高速自己主动注冊并可以登录客户应用. 从webserver与腾讯server通信获取开房平台用户OpenID,再在应用ser ...