判断无向图和有向图是否有回路

判断一个有向图是否存在回路 本算法改编自“用邻接矩阵表示的深度优先搜索算法”,即DFS算法,两者共同点均为递归调用,DFS算法已在注释中标出,可进行对比学习。loop函数无论是强连通图非强连通图均能判断是否存在回路。 在loop函数中 1.visited数组用于记录被访问过的节点,DFS算法中的visited数组相同。 2.count数组只有一个元素即count[0],初始值为1,若能找到回路,则count[0]=1;为什么用count[0]而不直接用int count变量?因为loop函数中要进行很多次递归调用,若用count 阅读详情

一、无向图回路的判断

    对于无向图,判断其是否有回路有四种方法,如下所示:

    1、利用深度优先搜索DFS,在搜索过程中判断是否会出现后向边(DFS中,连接顶点u到它的某一祖先顶点v的边),即在DFS对顶点进行着色过程中,若出现所指向的顶点为黑色,则此顶点是一个已经遍历过的顶点(祖先),出现了后向边,若完成DFS后,则图中有回路;

    2、在图的邻接表表示中,首先统计每个顶点的度,然后重复寻找一个度为1的顶点,将度为1和0的顶点从图中删除,并将与该顶点相关联的顶点的度减1,然后继续反复寻找度为1的,在寻找过程中若出现若干顶点的度都为2,则这些顶点组成了一个回路;否则,图中不存在回路。

    3、利用BFS,在遍历过程中,为每个节点标记一个深度deep,如果存在某个节点为v,除了其父节点u外,还存在与v相邻的节点w使得deep[v]<=deep[w]的,那么该图一定存在回路;
    4、用BFS或DFS遍历,最后判断对于每一个连通分量当中,如果边数m>=节点个数n,那么改图一定存在回路。因此在DFS或BFS中,我们可以统计每一个连通分量的顶点数目n和边数m,如果m>=n则return false;直到访问完所有的节点,return true。

二、有向图回路的判断

    对于有向图,判断其是否有回路的方法也有两种,如下所示:

    1、与无向图类似,若在DFS中出现后向边,即存在某一顶点被第二次访问到,则有回路出现;

    2、同样,利用拓扑排序的思想,通过这一步骤来执行拓扑排序,即重复寻找一个入度为0的顶点,将该顶点从图中删除,并将该顶点及其所有的出边从图中删除(即与该点相应的顶点的入度减1),最终若途中全为入度为1的点,则这些点至少组成一个回路。

    对于有向图,具体点就可得到如下分析:

    问题分析:如果图中存在回路,则必包含一个子图为回路。即该子图中所有顶点入度不为0且至少有边指向另外的顶点。
    算法:
    步骤1:按邻接表方式存储图。遍历与每个节点关联的边并统计每个节点的入度。需要O(n+m)次的运算。
    步骤2:删除所有入度为零的顶点及其相发出的边。并将被删除边所指向的顶点的入度减1。
    重复步骤2直到:
    (1)所有顶点被删除(则没有回路)或;
    (2)还有顶顶点但没有入度为零的顶点可删除(则存在回路)。
    算法复杂度分析:
    由于步骤二中的删除边的操作运算复杂度为O(m),删除节点的操作为O(n) 判断节点入度是否为0需要O(n+m)次运算。其中O(n)次为初始入度为零的节点,O(m)次为删除边后导致的入度为零的节点。于是整个算法复杂度为O(m+n)。

【数据结构C语言】深度优先遍历DFS检查无向图有向图回路 【待更新...】 对天勤数据结构课后习题的深度思考: 问题:T218 1.(2) 解答:T226 1)有向图DFS的visited[]数组0,1状态上进行扩充,0表示为访问过,1表示已访问但还没监测完这个顶点可能出现的回路(即还没退出系统栈,处于有子结点还在访问的状态),2表示该结点已经退出系统栈(即不在递归层中)。进入DFS函数对v访问时,标记为1,然后访问子结点,如果子结点被访... 阅读详情

相关推荐

图的欧拉回路/欧拉路径判断

欧拉回路/路径判断方法: 首先图必须是联通的,用并查集判即可 无向图欧拉回路:所有点度数都为偶数 无向图欧拉路径:图中只有两个点(或0个点)度数为奇数 有向图欧拉回路:所有点入度=出度 有向图欧拉路径:一个点入度=出度+1,一个点出度=入度+1(两个端点),其余点(或所有点)入度=出度 无向图 判断是否存在欧拉路径/回路: 利用并查集判断是否联通,利用degree数组统计结点数。 #include <iostream> using namespace

学渣日记 3257

C语言经典算法之判断图中回路(深度优先遍历实现)

判断一个图(这里特指有向图是否存在回路,可以采用深度优先搜索DFS)或拓扑排序两种方法。

weixin_56154577的博客 3849

欧拉回路dfs 。。。。。等会补fleury算法:)

若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈,则称为欧拉(Euler)回路。 具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图 以下判断基于此图的基图连通。 无向图存在欧拉回路的充要条件 一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。 有向图存在欧拉回路的充要条

DS00HY的小博客 2276

图5——判断有向图是否存在回路

假设以邻接矩阵作为图的结构,编写算法,判别在给定的有向图是否存在一个简单的有向回路,若存在,则以顶点序列的方式输出该回路(找到一条即可)(注意:图中不存在顶点到自身的弧) 这是清华大学的考研试题。为了判断有向图是否存在,可以通过深度优先搜索的方法来实现。从编号0的顶点出发,若两个顶点间存在路径,则记录下源顶点标记为已访问(标记为-1)。在遍历的过程中,若有顶点与源顶点相同,则说明存在。 ...

凌空的桨 2万+

DFS有向图是否存在

思路: 利用book[]标记状态,0表示未访问,1表示正在访问,2表示所有子节点访问完毕。然后dfs每个点寻找是否存在回路。 #include <iostream> #include <vector> using namespace std; vector<int> map[1111]; int flag = 0, book[1111]; bool dfs(int cur) { book[cur] = 1; for (auto i : map[cur])

学渣日记 678

欧拉回路

什么是欧拉回路? 欧拉回路是在无向图中从一个点(或有向图从起点)出发走出一条每条边恰好经过一次的道路。 我们学要学会判断该图是否为欧拉回路,以及写出欧拉回路。 欧拉回路的条件: 奇点:度数为奇数的点(无向图无出度,入度概念)。 1:无向图: 前提:无向图必须为连通图。 最多只能有两个奇点,且必须是从一个奇点出发,到达另一个奇点。若无奇点,则回到原点。 2:有向图 前提:有向图...

qq_43185391的博客 889

欧拉路径欧拉回路:输出有向图无向图的欧拉回路编号。

原题链接:https://www.acwing.com/problem/content/1186/ 这道题有两种情况,有向图无向图。对于这两种图,我们都需要找到欧拉回路。 参考题解链接:https://www.acwing.com/solution/content/53434/ /* 有向图无向图分开处理 首先进行判断,如果有向图存在点出度不等于入度,则不存在欧拉回路 荣国无向图中欧拉回路中度数为奇数的点为0 然后从一个不孤立的点开始dfs(u).

qq_45766916的博客 735

欧拉回路/通路

定义: 如果图G中所有边一次仅且一次行遍所有顶点的通路称作欧拉通路。 如果图G中所有边一次仅且一次行遍所有顶点的回路称作欧拉回路。 简而言之就是一笔画的游戏。 判断: 前提,图联通。 欧拉通路: 有向图:有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。 无向图:只有两个顶点是奇数度,其余都是偶数度的。 欧拉回路有向图:所有的顶点出度=入度。 无向图:所有顶点都是偶数度。 判断方法: 并查集判断是否连通,度数的判断无向图欧拉回路(HDU1878): #include<bits

Z7784562的博客 336

欧拉回路判定算法·一笔画问题

如果图中的一条路经经过每条边一次,则该路径称为欧拉路径。 如果该路径正好是一个回路,即从起点出发又回到起点,则该路径称为欧拉回路。 如果一个图有欧拉回路,则该图称为欧拉图。 无向图存在欧拉回路的充要条件 一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。 无向图存在欧拉路径的充要条件 当且仅当该图顶点度数为奇数的点的个数为0或者2。 欧拉定理二: 如果一个无向图有2n个奇顶...

JJJ's blog 4102

图论 - 欧拉回路欧拉通路的判定

图论 - 欧拉回路欧拉通路的判定   给出一幅n个点,m条边的图,分别判断该图是无向图有向图条件下,是否存在欧拉通路。 输入 输入包含多组数据。第一行为一个整数T(1 ≤ T ≤ 100),代表数据组数,对于每组数据: 第一行是两个整数nm( 1 ≤ n ≤ 500, 0 ≤ m ≤ n(n − 1)/2 ),分别代表图上点的个数...

仓鼠 1125

如何判断一个图中是否存在回路

问题描述:给一个图G=,问如何判断这个图中是否存在回路?请给出至少3中方法 分析: 方法1:利用减枝的方法,如果G为有向图:        1)首先删除入读为0的点,并且将对应的该点相连的点的入读-1。(可以用一个数组表示节点被删除的状态)        2)重复过程1),直到没有入读为0的点,如果还有没被删除的节点,则该有向图一定存在回路       如果G为无向

Rainner 1万+

判断图中是否存在回路的方法

数据结构--判断图中是否存在的方法。DFS可以判断有向图无向图是否存在,而BFS只能判断有向图

m0_62600503的博客 8337

判断一个有向图是否存在回路,除了可以利用拓扑排序方法外,还可以利用

判断一个有向图是否存在回路,除了可以利用拓扑排序方法外,还可以利用() A 求关键路径的方法 B 求最短路径的Dijkstra方法 C 深度优先遍历算法 D 广度优先遍历算法 答案:C (dfs) 利用深度优先遍历可以判断图G中是否存在回路。对于无向图来说,若深度优先遍历过程中遇到了回边,则必定存在;对于有向图来说,这条回边可能是指向深度优先森林中另一棵生成树上的顶点的弧;但是,从有向图的某个顶...

AFEI666666的博客 2万+

判断无向图是否回路

关于无向图判断是否存在回路的方法:      第一种是类似有向图拓扑排序的思路:(参考有向图判断回路的解答)    如果存在回路,则必存在一个子图,是一个。因此该子图中所有顶点入度>=1。 算法:    在有向图中,先找出入度为0的顶点,删除与这个顶点相关联的边(出边),将与这些边相关的其它顶点的入度减1,循直到没有入度为0的定点。如果此时还有未被删除顶点,则必存在路,否则不存在路。

Stephan14的专栏 2万+

采用DFS算法实现逆拓扑排序,并判断是否回路

利用DFS算法实现拓扑排序时,判断是否回路/

weixin_44356846的博客 8394

有向图DFS遍历及判断是否

#include <iostream> #include <cstdio> #include <vector> #include <cstring> #include <string> #include <algorithm> using namespace std; const int MAX = 1000; int color[MAX]; int Time; bool is_DAG; // 分别是时间撮,是否 int f..

weixin_42864519的博客 2752

2010软专算法题(判断有向图是否回路

已知有向图G=(V,E),具有n个顶点,以邻接表的形式存储。请设计一个算法,判断图G中是否存在有向回路

UncleJokerly 1415
上一篇: 线程和fork
ddppqq
博客等级 码龄17年 15粉丝 60原创
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值