题目链接:Is It A Tree?

题意:给你一系列形如u v的点对(u v代表一条由u指向v的有向边),请问由给你的点构成的图是不是一棵树?

树的特征:①每个节点(除了根结点)只有一个入度;②只有一个根结点。

题解:用并查集合并点,对于一条边,如果连接的两点已经在同一并查集内,则可以直接判否。合并时按边的方向记录点的入度,如果某个点入度大于1也就是某个点有多个父亲节点,则说明不是树。合并时顺便记录合并总次数,最后合并点数-1次则是树。

代码:

#include <stdio.h>
#include <memory.h> const int MAX_SIZE = 105;
int parent[MAX_SIZE];
bool flag[MAX_SIZE]; void make_set(){ //初始化
for(int x = 1; x < MAX_SIZE; x ++){
parent[x] = x;
flag[x] = false;
}
} int find_set(int x){ //寻找根节点,带路径压缩
if(x != parent[x])
parent[x] = find_set(parent[x]);
return parent[x];
} void union_set(int x, int y){ //合并
x = find_set(x);
y = find_set(y);
if(x == y) return;
parent[y] = x;
} bool single_root(int n){ //判断是不是只有一个根,条件(1)
int i = 1;
while (i <= n && !flag[i]){
++i;
}
int root = find_set(i);
while (i <= n){
if (flag[i] && find_set(i) != root){
return false;
}
++i;
}
return true;
} int main(){
int x, y;
bool is_tree = true;
int range = 0;
int idx = 1;
make_set();
while (scanf("%d %d", &x, &y) != EOF){
if (x < 0 || y < 0){
break;
} if (x == 0 || y == 0){
if (is_tree && single_root(range)){
printf("Case %d is a tree.\n", idx++);
}
else{
printf("Case %d is not a tree.\n", idx++);
}
is_tree = true;
range = 0;
make_set();
continue;
} if (!is_tree){
continue;
}
range = x > range ? x : range;
range = y > range ? y : range; flag[x] = flag[y] = true;
if (find_set(x) == find_set(y)){ //如果两者属于一个集合(也就是有共同祖先),并且两者还有父子关系,那么无法形成树,条件2
is_tree = false;
}
union_set(x, y);
}
return 0;
}

最新文章

  1. Jedis测试redis
  2. crontab 提示 command not found 解决方案
  3. dictionaryWithContentsOfFile:方法
  4. Python读写excel
  5. Git + BeyondCompare
  6. EF中使用SQL语句或存储过程
  7. HRBUST1530
  8. C#遍历打印机
  9. 【Android车载系统 News | Tech 3】News 从手机征战到汽车 Android Auto对比CarPlay 2014-12-29
  10. 《深入Java虚拟机学习笔记》- 第15章 对象和数组
  11. Codeforces Round #371 (Div. 2) 转换数字
  12. Java技术 第一次作业
  13. DG Switch over
  14. MapReduce的二次排序
  15. C++拷贝构造函数与 = 重载
  16. phpstorm中设置代码上传到github
  17. Crash 文件调试
  18. c++从文件中读取一行数据并保存在数组中
  19. UART简介
  20. AX内部公司

热门文章

  1. 掘金上发现的有趣web api
  2. checkbox 全选
  3. UDP端口启动后一段时间无法接收到数据
  4. LeetCode 简单 - 路径总和(112)
  5. CF1042B 【Vitamins】(去重,状压搜索)
  6. 修改zabbix字体格式
  7. Linux 下文件压缩与解压命令详解
  8. DISTINCT 去重仍有重复的分析
  9. docker API 配置与使用
  10. 微信小程序之公共组件写法