搜索
写经验 领红包
 > 时尚

深度优先搜索可以判断图中是否有环(用深度优先搜索遍历一个有向无环图)

导语:深度优先搜索算法检测有向环的理解和实用方法

在调度系统中牵扯到对调度数据结构的有向环进行检测,所以使用DFS算法来检测组装形成的调度数据结构不存在无限循环结构,记录分享DFS如何检测环的。

举个栗子

栗子

转换 为临接矩阵可以转化为数据问题:

矩阵表示

根据深度优先搜索,我们这里默认按行进行遍历,对于第一行,起始节点就是第一行对应到那个元素0,遍历到第二个元素时发现不为0,则节点0可以到达节点1;接着以节点1作为中转点,遍历节点1对应的那一行,也就是矩阵中的第二行,发现节点1可以到达节点2;同理,继续遍历节点2所在的行,发现节点2可以到达节点0,而节点0正是起始节点,也就是发现了有向图中存在着环路。

检测图解

代码实现

import java.util.Arrays;public class graph {    private static boolean result = false;    public static void main(String[] args) {        int[][] matrix = new int[][]{{0,1,0,1,1},                                     {0,0,1,0,0},                                     {1,0,0,0,0},                                     {0,0,0,0,0},                                     {0,0,0,0,0}};        boolean[] visited = new boolean[matrix.length];        for(int i = 0; i < matrix.length; i++)            for(int j = 0; j < matrix[0].length; j++){                //节点i到j可达则进行深度优先搜索                if(matrix[i][j] != 0){                    Arrays.fill(visited, false);                    visited[j] = true;                    dfs(matrix, i, j, visited);                }                if(result){                    System.out.println();                    return;                }            }        System.out.println();    }    private static void dfs(int[][] matrix, int start, int cur_node, boolean[] visited){        for(int col = 0; col < matrix.length; col++){            //当前节点可达且未访问过            if(matrix[cur_node][col] != 0 && !visited[col]){                if(col == start){                    result = true;                    return;                }                //记录访问过的节点                visited[col] = true;                dfs(matrix, start, col, visited);                visited[col] = false;            }        }    }}

深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分 支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发 现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。DFS属于盲目搜索。

深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用堆数据结构来辅助实现DFS算法。

深度优先遍历图算法步骤:

1. 访问顶点v;

2. 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;

3. 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

如下图

转换图解

借用一个邻接表和布尔类型数组(判断一个点是否查看过,用于避免重复到达同一个点,造成死循环等),先将所有点按一定次序存入邻接表,再通过迭代器,对邻接表的linklist和布尔数组做出操作,从而达到不重复递归遍历的效果。

免责声明:本站部份内容由优秀作者和原创用户编辑投稿,本站仅提供存储服务,不拥有所有权,不承担法律责任。若涉嫌侵权/违法的,请与我联系,一经查实立刻删除内容。本文内容由快快网络小德创作整理编辑!