利用_DFS_来判断无向图是否存在环的条件思路,我看一次_DFS_是否能访问到之前访问到的节点,如果能够访问到,就说明图存在环,那么关键问题就是判断是一次DFS?,追根到_DFS_算法的实现细节,发现我们设置_visited_数组时只有设置0和1两个状态,那么就可以改进以下之前的_DFS_算法,将_visited_各个状态表示成如下状态:

  • 0: 没有被访问过
  • 1: 刚刚访问,但是邻接点没有被全部访问完
  • 2: 所有的邻接点都被访问完了,这里就可以判定_DFS_一定退出了

  关键问题就解决了,看下面的简易的测试代码,同时也运用到了并查集的数据结构:

#include<iostream>
#include<stdlib.h>
#define maxsize 100
#define INF 0x3f3f3f3f using namespace std; int g[maxsize][maxsize];
int vexnum, arcnum;
int visited[maxsize], father[maxsize];
int flag = 0; void InitGraph(){
cout << "输入顶点数和边数: ";
cin >> vexnum >> arcnum;
for(int i = 0; i < vexnum; i++){
//初始化visited数组和father数组
visited[i] = 0;
father[i] = -1;
}
for(int i = 0; i < arcnum; i++){
int s, e;
cout << "请输入第" << i << "条边的起点和终点: ";
cin >> s >> e;
g[s][e] = 1;
g[e][s] = 1;
}
} void DFS(int v){
visited[v] = 1;
for(int i = 0; i < vexnum; i++){
if(i != v && g[v][i] != INF){
//这里的判断是重点!!一次DFS且该节点不是从上一个节点过来的
if(visited[i] == 1 && father[v] != i){
flag = 1;
cout << "图存在环: ";
int tmp = v;
while(tmp != i){
cout << tmp << " ";
tmp = father[tmp];
}
cout << tmp << endl;
}else{
if(visited[i] == 0){
father[i] = v;
DFS(i);
}
}
}
}
visited[v] = 2;
} int main(){
InitGraph();
for(int i = 0; i < vexnum; i++){
if(!visited[i])
DFS(i);
}
if(!flag)
cout << "图不存在环!" << endl;
return 0;
}

有向图是否存在环

  只需要将上述代码的无向图的构造过程改成有向图即可

DFS判断图是否有环的更多相关文章

  1. cf290-2015-2-3总结与反思(dfs判断无向图是否有环)

    bool dfs(int i,int pre) { visit[i]=true; ;j<=v;j++) if(g[i][j]) { if(!visit[j]) return dfs(j,i); ...

  2. 如何判断图中存环(正&负)

    1.正环 用 SPFA不断的进行松弛操作,发现当前金额可以比本身大就更新,同时记录更新次数.如果更新次数超过n次,说明存在”正“环. 2.负环 这里先说明下负环.(求最短距离的时候) 在我们用SPFA ...

  3. DFS判断连通图

    因为是连通图,所以从任意一点出发,一定可以通过一遍深度优先遍历就能走过所有的点和边,就可以利用这个性质来很容易的通过DFS判断图是否为连通图 下面是具体算法:

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

    没有找到原文出处,请参考一下链接: http://www.cnblogs.com/hiside/archive/2010/12/01/1893878.html http://topic.csdn.ne ...

  5. POJ 1860 Currency Exchange(如何Bellman-Ford算法判断图中是否存在正环)

    题目链接: https://cn.vjudge.net/problem/POJ-1860 Several currency exchange points are working in our cit ...

  6. 判断图连通的三种方法——dfs,bfs,并查集

    Description 如果无向图G每对顶点v和w都有从v到w的路径,那么称无向图G是连通的.现在给定一张无向图,判断它是否是连通的. Input 第一行有2个整数n和m(0 < n,m < ...

  7. POJ 1308&&HDU 1272 并查集判断图

      HDU 1272 I - 小希的迷宫 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  8. POJ 3259 Wormholes(最短路,判断有没有负环回路)

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24249   Accepted: 8652 Descri ...

  9. poj3259Wormholes (Bellman_Ford/SPFA/Floyed算法判断是否存在负环)

    题目链接:http://poj.org/problem?id=3259 题目大意:一个图,有n个顶点,其中有m条边是双向的且权值为为正,w条边是单向的且权值为负,判断途中是否存在负环,如果有输出YES ...

随机推荐

  1. 【Java并发基础】并发编程领域的三个问题:分工、同步和互斥

    前言 可以将Java并发编程抽象为三个核心问题:分工.同步和互斥. 这三个问题的产生源自对性能的需求.最初时,为提高计算机的效率,当IO在等待时不让CPU空闲,于是就出现了分时操作系统也就出现了并发. ...

  2. winds消息大全

    本文链接:https://blog.csdn.net/testcs_dn/article/details/42360547 消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如, ...

  3. 三、Spring Cloud之软负载均衡 Ribbon

    前言 上一节我们已经学习了Eureka 注册中心,其实我们也使用到了Ribbon ,只是当时我们没有细讲,所以我们现在一起来学习一下Ribbon. 什么是Ribbon 之前接触到的负载均衡都是硬负载均 ...

  4. 第7节class与style绑定

    方法一 效果图:  方法二 效果图:  方法三 效果图: 代码: <!DOCTYPE html> <html lang="en" xmlns:v-bind=&qu ...

  5. Vue 编程式的导航

    1.应用场景 在同一路由的情况下,不同的参数之间进行切换 注意:别忘记初始化路由页面 2.用法 a.定义方法 b.实现方法 c.初始化路由页面 3.案例 <template> <di ...

  6. git hub安装

    windows下GitHub的安装.配置以及项目的上传过程详细介绍 阅读目录 概要 操作必备 GitHub的安装 Git的初始配置 本地Git与远程GitHub连接的建立 将本地项目上传到GitHub ...

  7. ios---CoreLocation框架实现定位功能

    CoreLocation框架实现定位功能(iOS8.0之后) // // ViewController.m // 定位 // // Created by admin on 2017/9/20. // ...

  8. mybatis generator cmd 终端命令 生成dao model mapper

    mybatis generator cmd 终端命令 生成dao model mapper 文件包下载 mybatis-generator-core-1.3.2.jar 下载地址:https://gi ...

  9. ES6笔记分享 part 2

    ECMAScript ES6 从一脸懵逼到灵活运用 接 part 1 New String Methods const id = 'adcd123456x'; const fan = 'I love ...

  10. Guava中强大的排序器Ordering使用

    一 创建排序器 排序器:可以用来为构建复杂的比较器,以完成集合排序的功能: 本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例. Ordering把很多基于Comparat ...