判断一个图中有无环路的存在

这里要引入两个概念:

1.树边:是一条未被遍历过的边,它指向一个未被访问过的点。

2.反向边:是一条未被遍历过的边,它指向一个被访问过的点。

如果图中有环路的存在,那么环路的最后一个边必然是一条反向边。

我的参考

那么,我们在DFS遍历的过程当中,只需要添加一条语句来判断所有未被检查过的边的指向点是否已被访问过,就可以判断出这个图是否存在环路了。

 1 struct Edge {
 2     int to, w, next;
 3 };
 4
 5 struct adjTable {
 6     int node[maxv];
 7     int visit[maxe];
 8     int cnt;
 9     bool cycle;
10     struct Edge e[maxe];
11     void init() {
12         memset(node, -1, sizeof(node));
13         memset(visit, 0, sizeof(visit));
14         cnt = 0;
15         cycle = false;
16     }
17     void addedge(int u,int v) {
18         e[cnt].to = v;
19         e[cnt].next = node[u];
20         node[u] = cnt++;
21     }
22     void read() {
23         int n, u, v, w;
24         scanf("%d", &n);
25         for (int i=1; i<=n; i++) {
26             scanf("%d %d", &u, &v);
27             addedge(u, v);
28         }
29         return ;
30     }
31     void dfs(int p) {
32         int i;
33         for (i=node[p]; i!=-1; i=e[i].next) {
34             if ( visit[e[i].to] )//判断第i条边是否为反向边
35                 cycle = true; //dfs运行之后就可以根据cycle的true还是false来判断环路是否存在了
36             if (visit[ e[i].to ] == 0) {
37                 printf("%d %d\n", p, e[i].to);
38                 visit[ p ] = 1;
39                 dfs( e[i].to );
40             }
41         }
42     }
43 };
时间: 2024-10-01 07:09:01

判断一个图中有无环路的存在的相关文章

C#判断一个类中有无&quot;指定名称&quot;的方法

C#中可以通过反射分析元数据来解决这个问题,示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 using System; using System.Reflection; namespace Hello {     class Program     {  

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

最近公司的项目中,有个树形结构变图结构的问题.本来我们对项目中实体之间的关系是按树形结构来表示的,也就是说实体之间不会重用,也不会有环.现在我们需要变成图的结构,实体之间可以重用,但不能有环.那么该如何解决这个问题呢? 我们先定义出什么是环: 环定义:从一条边出发,如果能回到当前边则证明有环. 可见,根据定义,上面的图不存在环.因为从任意一条边出发都不可能回到自身.下面给出一个带有环的图. 图中红色箭头的3,4,5构成了一个环路.因为从3.4.5任一点出发,都可以回到起始点.那么我们如何使用代码

(转)判断一个图是否有环 无向图 有向图

无向图: 法1: 如果存在回路,则必存在一个子图,是一个环路.环路中所有顶点的度>=2. n算法: 第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一. 第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一. 如果最后还有未删除顶点,则存在环,否则没有环. n算法分析: 由于有m条边,n个顶点.如果m>=n,则根据图论知识可直接判断存在环路. (证明:如果没有环路,则该图必然是k棵树 k>=1.根据树的性质,边的数目m = n-k.k

算法之判断一个图是否有环

在一些经典算法中,经常需要判断一些图是否具有环路,比如拓扑排序,需要在最初判断该图是否有环路,如有有环路,则无法找到最长的一条线,比如dijkstra算法,每找到一条最短的边,都要判断找到的边和现有的树是否已经构成了环路. 因此,在这篇博客,我们重点来说一个判断图是否有环的算法. 首先我们介绍一个对于无向图和有向图通用的算法,先讲算法思路: 1.统计各个图中各个点的入度数(能够到达这个点的点). 2.然后找出入度数为0的点(无向图找入度数为1的点). 3.删除入度数为0的点,将其边也删除. 4.

判断一个图是否有环 无向图 有向图(转)

没有找到原文出处,请参考一下链接: http://www.cnblogs.com/hiside/archive/2010/12/01/1893878.html http://topic.csdn.net/u/20071023/11/3edb81fc-37b2-4506-906e-44dc0fc521f2.html 一.无向图: 方法1: 如果存在回路,则必存在一个子图,是一个环路.环路中所有顶点的度>=2. n算法: 第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度

【C++】判断一个图是否有环 无向图 有向图(转载)

没有找到原文出处,请参考一下链接: http://www.cnblogs.com/hiside/archive/2010/12/01/1893878.html http://topic.csdn.net/u/20071023/11/3edb81fc-37b2-4506-906e-44dc0fc521f2.html 一.无向图: 方法1: 如果存在回路,则必存在一个子图,是一个环路.环路中所有顶点的度>=2. n算法: 第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度

用并查集判断一个无向图中是否存在环

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

并查集(判断一个图有几个连通块)

import java.util.Scanner; // 并查集 判断一个图中有几个联通块 public class UnionFind { private int[] father;// private int count;// 分量数量 public UnionFind(int N){ count=N; father=new int[N]; for(int i=0;i<N;i++){ father[i]=i; } } public int count() { return count; }

算法积累(字符串转换驼峰,判断一个字符串中那个字母出现次数最多,并且出现了几次)

因为算法比较烂,所以想做一下这方面的积累. 尽量能够每天学习一个新算法吧.(不过估计很悬) 好吧,今天第一个是字符串转换驼峰 直接上代码 var str = 'toupper-case'; var arr = str.split('-'); //toupper,case for (var i = 1; i < arr.length; i++) { //把除了第一个数组后面的数组的第一个值设置为大写然后大写字母和去掉第一个字符的剩下的字符进行拼合 arr[i] = arr[i].charAt(0)