题目:给你一些有向边(端点,长度为1)。推断给定的图是否是一棵树。

分析:图论。并查集。树是一个全部点都连接的有向无环图(不连接的是森林)。

依照树的定义推断是否有环就可以,有环分成两种:

1.链状环;2.存在节点有多个父亲节点;

这两种情况,仅仅要用并查集在合并前推断是否数以一个集合就可以,

假设在统一集合中,这条边一定形成环;

注意推断不能是森林。

说明:╮(╯▽╰)╭又是一个没有数据范围的题目。

#include <iostream>
#include <cstdlib>
#include <cstdio> using namespace std; int used[100001];
int sets[100001],rank[100001]; int set_root(int a)
{
if (a != sets[a])
sets[a] = set_root(sets[a]);
return sets[a];
} int main()
{
int a,b,t = 1;
while (~scanf("%d%d",&a,&b) && a >= 0 && b >= 0) {
for (int i = 0 ; i < 100000 ; ++ i) {
sets[i] = i;
used[i] = rank[i] = 0;
}
int flag = 1;
while (a||b) {
if (set_root(a) == set_root(b))
flag = 0;
if (flag) {
used[a] = used[b] = 1;
sets[set_root(b)] = set_root(a);
}
scanf("%d%d",&a,&b);
} if (flag == 1) {
int count = 0;
for (int i = 0 ; i < 100000 ; ++ i)
if (used[i] && set_root(i) == i)
if (count ++) {
flag = 0;
break;
}
} if (flag == 0)
printf("Case %d is not a tree.\n",t ++);
else printf("Case %d is a tree.\n",t ++);
} return 0;
}

最新文章

  1. 从C++到GO
  2. jvm、jre、jdk
  3. python网站收集
  4. commonJS — 对象操作(for Object)
  5. php中使用linux命令四大步骤
  6. Java之 AtomicInteger
  7. Atmospheric Scattering in Unity5
  8. windows下搭建PHP环境
  9. 【HDOJ】2416 Treasure of the Chimp Island
  10. HDU_2051——十进制到二进制转换
  11. 【二叉树-&gt;链表】二叉树结构转双向线性链表结构(先序遍历)
  12. TCP连接建立过程中为什么需要“三次握手”(转)
  13. Qt 如何处理拖放应用程序参数时,中国
  14. JQuery获取图片大小并控制图片文件上传大小以及上图片文件时如何预览图片
  15. Android安全升级的7.0: Nougat
  16. OAF实现下拉菜单联动
  17. os模块walk方法
  18. jQuery 心跳请求
  19. Android 实时录音和回放,边录音边播放 (KTV回音效果)
  20. 深入理解java虚拟机---java虚拟机内存管理(六)

热门文章

  1. Linux文件系统中/tmp的临时文件清理说明
  2. AC日记——送花 洛谷 P2073
  3. 导出数据到word
  4. lr_Vugen界面图
  5. nginx中使用perl模块
  6. thinkphp之自动完成
  7. python3 2017.3.19
  8. 《深入浅出Nodejs》笔记——模块机制(2)
  9. HDU6074 Phone Call (并查集 LCA)
  10. 【stl小记】list