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 ...
随机推荐
- nyoj--38--布线问题(克鲁斯卡尔)
布线问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的 ...
- POJ 3265 DP
思路: f[i][j]表示前i天能做j道题 (是做 不是做完) if(f[i-1][k]) if(suma[j]-suma[k]+g[i-1][k]<=n) f[i][j]=1,g[i][j]= ...
- HDU 4358 Boring counting dfs序+莫队算法
题意:N个节点的有根树,每个节点有一个weight.有Q个查询,问在以u为根的子树中,有恰好出现了K次的weight有多少种. 这是第一次写莫队算法,之前也只是偶有耳闻. 看了别人的代码打的,还是贴上 ...
- JS实现PC端全兼容复制
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 03013_JDBC工具类
1.“获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils.提供获取连接对象的方法,从而达到代码的重复利用. 2.该工具类提供方法:public static C ...
- struts2的acton标签中的ignoreContextParams属性和param子元素的冲突
<s:action ignoreContextParams="true" executeResult="true" name="login&qu ...
- Codeforces 164 D Minimum Diameter
题目链接~~> 做题感悟:越来越感觉CF的题非常好,非常有深度. 解题思路: 这题须要注意 k 的大小.由于 k 仅仅有 30 个,终于形成的点的直径一定是某个确定的值,所以我们能够枚举这个值. ...
- Android引入library失败的可能原因
eclipse环境,引入library一直失败 谷歌到的原因是 Windows下 目标工程必须和引用工程在同一磁盘盘符下 然后我将要引入的library项目移动和现在项目同一磁盘下,引入成功 至于为什 ...
- css3的新特性选择器-------属性选择器
自己学css的时候比较乱,这次趁着复习把css3的新特性选择器和css2以前不怎么用的选择器做一个总结 <div id="parent"> <p>I'm a ...
- ArraySegment 的使用 【转载】
本文转载自 http://www.cnblogs.com/overred/archive/2009/01/17/1359126.html ArraySegment顾名思义就是Array区块,数组的小抽 ...