判断一个图是否为树(有向图以及无向图)
整理的算法模板合集: ACM模板
目录
- 判断一个图是否为树
- 1. 无向图(hdu 1272 小希的迷宫)
- 2. 有向图(hdu 1325 Is It A Tree?)
判断一个图是否为树
1. 无向图(hdu 1272 小希的迷宫)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 200007, M = 5000007, INF = 0x3f3f3f3f;int fa[N], n, m;
bool vis[N];int Find(int x)
{if(fa[x] == x)return x;return fa[x] = Find(fa[x]);
}bool unions(int x, int y)
{int fx = Find(x);int fy = Find(y);if(fx != fy){fa[fy] = fx;//注意合并的是原来的点return true;}return false;//有环,不是树
}int x, y;
int kcase;int main()
{while(scanf("%d%d", &x, &y)){kcase ++ ;bool flag = true;if(x < 0 || y < 0)break;if(x == 0 && y == 0){puts("Yes");continue;}for(int i = 0; i < N; ++ i){fa[i] = i;vis[i] = 0;}while(!(x == y && y == 0)){vis[x] = true;vis[y] = true;if(unions(x, y) == 0){//有环,不是树flag = false;}scanf("%d%d", &x, &y);}int tot = 0;for(int i = 1; i < N; ++ i){if(vis[i] && fa[i] == i)//找有几个根tot ++ ;}if(tot != 1)flag = false;//cout << tot << "ok" <<endl;//入度大于1了或者成树林了if(flag)printf("Yes\n");elseprintf("No\n");}return 0;
}
2. 有向图(hdu 1325 Is It A Tree?)
题目大意:判断一个有向图是不是一棵树
判断条件:无环,一个根节点,(只有一个入度为0的结点,不存在入度大于1的结点)
我觉得一个树应该一定有一个根节点,AC了,但是好多题解都是可以有0个根节点或者有1个根节点,也AC了…
性质:根节点入度为0,其余所有的节点入度均为1。
注意是有向图的树,所以如果一个点入度大于1就说明不是树。 而无向图就没有这个限制。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 200007, M = 5000007, INF = 0x3f3f3f3f;int fa[N], n, m;
bool vis[N];int Find(int x)
{if(fa[x] == x)return x;return fa[x] = Find(fa[x]);
}bool unions(int x, int y)
{int fx = Find(x);int fy = Find(y);if(fx != fy){fa[fy] = fx;//注意合并的是原来的点return true;}return false;//有环,不是树
}int x, y;
int kcase;int main()
{while(scanf("%d%d", &x, &y)){kcase ++ ;bool flag = true;if(x < 0 || y < 0)break;if(x == 0 && y == 0){printf("Case %d is a tree.\n", ++ kcase);continue;}for(int i = 1; i < N; ++ i){fa[i] = i;vis[i] = 0;}while(!(x == y && y == 0)){vis[x] = true;vis[y] = true;//!因为树只有一条边指向节点,根没有边指向根节点,所以如果有两个及以上的边指向它就说明不是树if(Find(y) != y)flag = false;else if(unions(x, y) == 0){//有环,不是树flag = false;}scanf("%d%d", &x, &y);}int tot = 0;for(int i = 1; i < N; ++ i){if(vis[i] && fa[i] == i)//找有几个根tot ++ ;/*if(tot > 1){flag = 1;break;}*/}if(tot != 0 && tot != 1)flag = false;//cout << tot << "ok" <<endl;//入度大于1了或者成树林了if(flag)printf("Case %d is a tree.\n", kcase);elseprintf("Case %d is not a tree.\n", kcase);}return 0;
}
判断一个图是否为树(有向图以及无向图)相关推荐
- (HDU4324)判断一个图中是否存在两点的出度相同
题目:Triangle LOVE 因为每两个点一定有且仅有一条指向边,那么先假定点按顺序1,2,....n,每个点一定指向后面的点,即1指向2,3,4.....n,2指向3,4,5....n..... ...
- 判断图有无环_【转】判断一个图是否有环 无向图 有向图
无向图: 法1: 如果存在回路,则必存在一个子图,是一个环路.环路中所有顶点的度>=2. n算法: 第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一. 第二 ...
- 判断一个图是否有环(有向图,无向图)
无向图: 法1: 如果存在回路,则必存在一个子图,是一个环路.环路中所有顶点的度>=2. n算法: 中 第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一 ...
- 图论--拓扑排序--判断一个图能否被拓扑排序
拓扑排序的实现条件,以及结合应用场景,我们都能得到拓扑排序适用于DAG图(Directed Acyclic Graph简称DAG)有向无环图, 根据关系我们能得到一个线性序列,实现的方式是DFS,具体 ...
- c语言 判断一个图是否全连通_【连载】(判断执行语句)乐创DIY C语言讲义——3.8节(2)...
2 判断执行语句 判断执行语句,执行时候会有一个条件判断,一旦当条件判断为真,即True的时候,就执行相应的语句,满足条件被执行的语句用大括号"{}"括起来.由于在C语言中没有用于 ...
- 判断一个图中有无环路的存在
这里要引入两个概念: 1.树边:是一条未被遍历过的边,它指向一个未被访问过的点. 2.反向边:是一条未被遍历过的边,它指向一个被访问过的点. 如果图中有环路的存在,那么环路的最后一个边必然是一条反向边 ...
- c语言 判断一个图是否全连通_C语言:程序运行流程图与顺序结构语句
程序运行流程图 流程图是描述问题处理步骤的一种常用图形工具,它是由一些图框和流程线组成的.流程图描述问题的处理步骤,形象直观,便于阅读.画流程图时必须按照功能选用相应的流程图符号,常用的流程图符号如下 ...
- c语言 判断一个图是否全连通_基于云平台的全链路大规模网络连通性检测系统详解...
虚拟网络排查问题困难,传统的traceroute等工具很难起到太大作用,大部分情况下都需要到宿主机.混合云网关上抓包来troubleshooting,耗时又费力.有些场景中包的传送路径比较长(如跨域. ...
- 【数据结构和算法笔记】图的相关概念(有向图,无向图......)
最新文章
- windows上报错:Could not find a version that satisfies the requirement torch==0.4.1
- 搞对象的时候走神儿了
- python中api是指什么_python中API接口是什么
- Linux文件/目录 所有者/所在组
- java 模板方法设计模式_Java中的模板方法设计模式
- Java写入磁盘阵列_磁盘阵列RAID介绍及计算公式
- RDD Join 性能调优
- surging+EFCore 服务实现入门
- yacc 简易计算机规则,Lex Yacc 学习笔记(2)- 简单计算器
- c语言电话订餐管理系统
- 物联网(IOT)之常见物联网通信技术概览-有线篇
- Git 初接触 (四) Git的分支操作
- spring学习笔记 (6)使用mybatis操作数据库增删改查
- 如歌岁月--之《老鹰之歌》
- 13.爬虫训练场集成文件采集案例,来学习一下怎么实现的
- 年薪40万AI工程师必备的能力项,你达标了吗?
- box-shadow上下左右四个边框设置阴影样式
- IT-linux-top系列--top静态使用
- 智慧充电桩开发让充电变得更加安全
- 正则表达式前瞻(?=)、后顾(?<=)、负前瞻(?!)、负后顾(?<!)
热门文章
- 栈与队列4——用一个栈实现另一个栈的排序
- TechEd 2010-如何构建企业级ETL 后续补充
- 关于大搜车「无线开发中心」团队
- Aliyun LOG Java Producer 快速入门
- ng-model 绑定checkbox 取不到值?
- FutureTask demo
- 虚拟化--YESLAB DC Vphere5 上课PDF
- js如何关闭当前页,而不弹出提示框
- mysql 客户端提示“Cannot proceed because system tabl...
- 海思3531D上编译FFmpeg源码操作步骤