博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1308 Is It A Tree?
阅读量:6072 次
发布时间:2019-06-20

本文共 2174 字,大约阅读时间需要 7 分钟。

hot3.png

判断给定的结点是否构成一棵树。

注意:结点集合为空构成空树;有重复的边不是树;节点有指向自己的边不是树;树只有一个根节点;

思想:使用并查集。将添加的结点合并,最终只有一个结点。注意新加的结点b为a的长辈。

#include 
//#include
using namespace std;/* tree: 1. no cycle 2. noly indegree==0 3. else indegree==1*/const int size = 100000;//map
hash;int fa[size];bool vis[size];int Find(int x){ if (x == fa[x]) return x; return fa[x] = Find(fa[x]);}int main(){ int a, b; int cas = 1; int yes = 1; int i, maxn; while (scanf("%d %d",&a,&b)!=EOF) { if (a < 0 || b < 0) break; if (0 == a && 0 == b)// 空树 { printf("Case %d is a tree.\n",cas++); continue; } yes = 1; maxn = 0; for (i = 0; i < size; ++i) { fa[i] = i; vis[i] = 0; } if (a != b) fa[b] = a; else yes = 0; // self-directed vis[b] = vis[a] = 1; maxn = a > b? a :b; while (scanf("%d %d",&a,&b)!=EOF) { if (0 == a || 0 == b) break; if (!yes || a== b) { yes = 0; // self-directed continue; } vis[a] = vis[b] = 1; maxn = maxn>a?maxn:a; maxn = maxn>b?maxn:b; if (fa[b] != b || Find(a) == Find(b)) //b has more fa, b is a's father { yes = 0; //break; } else fa[b] = Find(a); } a = 0; for (i = 1; i <= maxn; ++i) { if (vis[i]) { if (Find(i) == i) a++; if (a > 1) { yes = 0; break; } } } if (a != 1) yes = 0; printf("Case %d is ",cas++); if (yes) printf("a tree.\n"); else printf("not a tree.\n"); } //system("pause"); return 0;}

转载于:https://my.oschina.net/acemumu/blog/101922

你可能感兴趣的文章
CentOS6.4关闭触控板
查看>>
ThreadPoolExecutor线程池运行机制分析-线程复用原理
查看>>
React Native 极光推送填坑(ios)
查看>>
Terratest:一个用于自动化基础设施测试的开源Go库
查看>>
修改Windows远程终端默认端口,让服务器更安全
查看>>
扩展器必须,SAS 2.0未必(SAS挺进中端存储系统之三)
查看>>
Eclipse遇到Initializing Java Tooling解决办法
查看>>
while((ch = getchar()) != '\n')
查看>>
好程序员web前端分享JS检查浏览器类型和版本
查看>>
Oracle DG 逻辑Standby数据同步性能优化
查看>>
exchange 2010 队列删除
查看>>
「翻译」逐步替换Sass
查看>>
H5实现全屏与F11全屏
查看>>
处理excel表的列
查看>>
Excuse me?这个前端面试在搞事!
查看>>
C#数据采集类
查看>>
quicksort
查看>>
【BZOJ2019】nim
查看>>
四部曲
查看>>
LINUX内核调试过程
查看>>