Is It A Tree?

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16702    Accepted Submission(s): 3761

Problem 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.

 #include<stdio.h>
#include<string.h>
const int M = + ;
int f[M] ;
int path[M] ;
int in[M] ;
bool vis[M] ; int Union (int x)
{
return x == f[x] ? x : f[x] = Union (f[x]) ;
}
int main ()
{
freopen ("a.txt" , "r" , stdin ) ;
int u , v ;
int cas = ;
while (~ scanf ("%d%d" , &u , &v)) {
if (u < || v < ) break ;
for (int i = ; i < M ; i ++) f[i] = i ;
memset (vis , , sizeof(vis));
memset (in , , sizeof(in)) ;
int tot = ;
if (!vis[u]) {
vis[u] = ;
path[tot ++] = u ;
}
if (!vis[v]) {
vis[v] = ;
path[tot ++] = v ;
}
in[v] ++ ;
// printf ("%d ----> %d\n" , u , v);
int x = Union (u) , y = Union (v) ;
f[y] = x ;
if (u != && v != ) {
while () {
scanf ("%d%d" , &u , &v) ;
// printf ("%d ----> %d\n" , u , v);
if (u == && v == ) break ;
if (!vis[u]) {
vis[u] = ;
path[tot ++] = u ;
}
if (!vis[v]) {
vis[v] = ;
path[tot ++] = v ;
}
in[v] ++ ;
int x = Union (u) , y = Union (v) ;
f[y] = x ;
}
for (int i = ; i < tot ; i ++) Union (path[i]) ;
// for (int i = 0 ; i < tot ; i ++) printf ("%d " , path[i]) ; puts ("") ;
// for (int i = 0 ; i < tot ; i ++) printf ("%d " , in[path[i]]); puts ("") ;
// for (int i = 0 ; i < tot ; i ++) printf ("%d " , f[path[i]]) ; puts ("") ;
bool flag = ;
int cnt = ;
int father = f[path[]] ;
for (int i = ; i < tot && !flag; i ++)
if (f[path[i]] != father )
flag = ; for (int i = ; i < tot && !flag ; i ++) {
if (in[path[i]] > ) flag = ;
if (in[path[i]] == ) cnt ++ ;
if (cnt > ) flag = ;
}
if (cnt == ) flag = ;
// printf ("flag = %d\n" , flag );
if (flag) printf ("Case %d is not a tree.\n" , cas ++);
else printf ("Case %d is a tree.\n" , cas ++) ;
}
else printf ("Case %d is a tree.\n" , cas ++) ;
}
return ;
}

检查入度,和每个结点的祖先。

终于解决了并查集压缩路径的不完全的问题。hahahaha。。。

另外没有结点,也被认为是树。

最新文章

  1. 关于Java运算中类型自动提升的问题
  2. VS2012一打开就停止工作的解决方法
  3. LeetCode Generalized Abbreviation
  4. NOIP2008 普及组T4 立体图 解题报告-S.B.S.(施工未完成)
  5. iOS 中contraints居中对齐的一点心得
  6. User Agent
  7. redis入门指南-附录A
  8. 【Weblogic】在linux创建domain过慢的解决方法
  9. vb代码之------画一个半透明矩形
  10. jspf与jsp的区别
  11. 如何实现Python调用C代码--python与C之间如何通信(swig)
  12. Xamarin.Android 报错问题
  13. 安装python3
  14. Tensflow的equal函数
  15. 给mysql添加一个只有某个数据库查询权限的用户
  16. mongodb数据库中插入数据
  17. UITableView 如何设置背景颜色
  18. ERROR 1045 (28000): Access denied for user &#39;ODBC&#39;@&#39;localhost&#39; (using password: N O) MYSQL
  19. MAVLink v1.0详解——结构
  20. 安装程序不能验证Update.inf文件的完整性,请确定加密服务正在此计算机上执行

热门文章

  1. 通过broadcastreceiver 监听短信问题
  2. Post请求和get请求乱码方式解决
  3. WPF中ListBox控件在选择模式(SelectionMode)为Single时仍然出现多个Item被选中的问题
  4. IOS - 打印COOKIE中的 CRFSToken
  5. SQL ALTER TABLE 语句在项目中的使用
  6. 服务器配置ssl证书支持苹果ATS方法
  7. FIREFOX A tool for easily making HTTP requests (GET/PUT/POST/DELETE)
  8. JQuery------获取&lt;input type=&quot;file&quot;&gt;中的文件内容
  9. 9月26日JavaScript表单验证、正则表达
  10. Java/JavaWeb中读取资源文件