如何判断无向图有环

有向图有无环可用拓扑排序进行检查,当拓扑排序后选出的点不是所有的点集,则该图有环。

但无向图无法使用拓扑排序。

无向图可使用深度优先搜索来寻找有无环,当搜索的当前节点的下一个邻接点(当前顶点的父顶点不算)已被访问过时,便有环。可通过简单修改递归DFS的代码来实现判断当前图有无环。

 1 void GraphAdjacencyListWeight::DFSRecursively(int StartVertex) {
 2     int *visited = new int[VertexNumber];
 3     memset(visited, 0, VertexNumber * sizeof(int));
 4
 5     while (!IsAllVisited(visited)) {
 6         DFSRecursively(StartVertex, visited, -1);
 7     }
 8 }
 9
10 void GraphAdjacencyListWeight::DFSRecursively(int ver, int *visited, int lastVer) {
11     VisitVertex(ver);
12     visited[ver] = 1;
13     for (auto tmpPtr = VectorVertexList[ver]->firstArc; tmpPtr != nullptr; tmpPtr = tmpPtr->nextArc) {
14         if (visited[tmpPtr->AdjacencyNode] != 1) {
15             DFSRecursively(tmpPtr->AdjacencyNode, visited, ver);
16         }
17         else if (tmpPtr->AdjacencyNode != lastVer && lastVer != -1) {
18             cout << "有环" << endl;
19         }
20     }
21 }
时间: 2024-08-08 13:40:50

如何判断无向图有环的相关文章

并查集(1)-判断无向图是否存在环

并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示.集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并. Find:确定元素属于哪一个子集.它可以被用来确定两个元素是否属于同一子集合. Union:将两个子集合并成同一个集合. 其实判断一个图是否存在环已经有相应的算法,此文用并查集来判断一个图是否有环. 我们可以用一个一维数组parent[] 来记录子集合. 看下面这个图: 0 | | 1

判断无向图是否有回路(是否有环)

总体思路: (1)通过广度遍历(BFS)访问图的所有点,对于每个点,都检测和已访问过的点是否有边(除了和它连接的上层节点). (1.1)如果有边,说明有回路(有环).如果对于每个点,都没有和已访问过的点有边,说明从该点出发的当前图没有回路(无环). (2)如果从任意点开始的BFS,以上操作(1)均说明无回路,则没有回路. 适用范围: (1)判断图添加一条无向边后是否有回路.只要从这条新边的一个点出发执行操作(1)即可. (2)判断一个图是否有回路.需要从任意点都执行一次操作(1),只有所有操作(

判断无向图/有向图中是否存在环

本文主要针对如何判断有向图/无向图中是否存在环的问题进行简单的论述. 一 无向图 1.利用DFS进行判断 利用DFS判断有向图是否存在环,是最为常用的一种方法,虽然这种方法很常用,但可参考的代码的实现比较少,下面对这种方法及其实现进行详细的阐述. 首先,利用DFS判断无向图中是否换的原理是:若在深度优先搜索的过程中遇到回边(即指向已经访问过的顶点的边),则必定存在环. 所以说,是否存在环的关键在于是否存在满足条件的"回边",那么如何判断回边呢? (1)首先,对图中的所有顶点定义三种状态

zstu.4191: 无向图找环(dfs树 + 邻接表)

4191: 无向图找环 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 117  Solved: 34 Description 给你一副无向图,每条边有边权,保证图联通,现在让你判断这个图是否有异或值大于零的环存在. Input 多组测试数据,每组先输入两个数n m,表示图的点跟边的数量. 然后是m行,每行三个数a b c.代表一条边的起点,终点,边权. 1 <= n<= 100000, 1 <= m <= 200000. 1 <

URAL 1227 Rally Championship(树的直径)(无向图判环)

1227. Rally Championship Time limit: 1.0 secondMemory limit: 64 MB A high-level international rally championship is about to be held. The rules of the race state that the race is held on ordinary roads and the route has a fixed length. You are given

单链表如何判断是否存在环

给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分

ZSTUOJ 4191 无向图找环(dfs)

中文题 直接dfs下去即可,遇到重复访问的点,判断一下该环三部分异或和是否大于0 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 100005; const int M = 400005; int n, m; struct Edge { int u, v, w; Edge() {} Edge(int u, int v, int

hdu 3342 Legal or Not (判断是否存在环)

Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4229    Accepted Submission(s): 1875 Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is

hdu 2120 Ice_cream&#39;s world I(判断是否有环,简单的并查集)

Ice_cream's world I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 603    Accepted Submission(s): 347 Problem Description ice_cream's world is a rich country, it has many fertile lands. Today,