有向图寻找环路python_有向图中打印所有的环路

本文探讨了如何在有向图中检测和打印环路的问题,特别是在IT企业应用依赖场景下。通过深度优先搜索(DFS)算法,作者提出并改进了三种解决方案,包括使用visited数组记录已访问节点,以及优化后的环路查找方法。最终实现能够找出所有环路,适用于复杂有向图的环路检测。
摘要由CSDN通过智能技术生成

最近项目中需要研究了一下有向图的环路问题。一个IT企业中有成千上万个应用,各个应用之间都是相互依赖的,一个用户请求进来后,会调用一系列应用,比如A调B、B调C、C调D等。这样所有的应用形成一个有向图,那么如果这个有向图中出现了环路,就悲剧了,用户的请求如果进入这个环路,那么他永远也得不到响应。所以就有需要去判断这个应用组成的有向图中是否含有环路,如果有就要打印出所有的环路,想办法将这些环路拆解。

说简单了,就是算法中的一个简单问题,在有向图中找到所有的环路。请教了宿舍的算法高手just,加上我自己的理解,产生了一些思路:

1.DFS树,找所有后退边

首先将有向图转化为一颗DFS树,如果碰到后退边,那么肯定存在环,打印之。那么实现的时候利用深度搜索维护一个节点是否被访问的数组visited[],如果搜索到已经被访问过的节点,那么就是一条环。这个可以过滤掉交叉边的情况,因为交叉边的节点还未被访问。搜索的路径用栈来维护,这样方便打印。为了方便,用java实现:

import java.util.ArrayList;

public class test {

static private final int POINT_NUM = 9;

static private int[] visited={0,0,0,0,0,0,0,0,0};

static private int[][] e={

{0,0,0,0,0,0,0,0,1},

{0,0,0,1,1,0,0,0,0},

{1,0,0,0,0,0,0,0,0},</

Python 可以使用深度优先搜索 (DFS) 和拓扑排序 (Topological Sorting) 两种算法来查找有向图环路。 1. DFS 算法: 在 DFS ,我们遍历整个图,并且记录每个点的访问状态。当我们遍历到一个已经被访问过的点时,意味着我们找到了一个环路。 以下是一个基于 DFS 的有向图环路查找算法的 Python 代码: ```python def has_cycle(graph): visited = set() for node in graph: if node not in visited: if dfs(graph, node, visited): return True return False def dfs(graph, node, visited): visited.add(node) for neighbor in graph[node]: if neighbor not in visited: if dfs(graph, neighbor, visited): return True else: return True visited.remove(node) return False ``` 2. 拓扑排序算法: 拓扑排序是一种对有向无环图 (DAG) 进行排序的算法。如果有向图存在环路,则无法进行拓扑排序。 以下是一个基于拓扑排序的有向图环路查找算法的 Python 代码: ```python def has_cycle(graph): in_degree = {node: 0 for node in graph} for node in graph: for neighbor in graph[node]: in_degree[neighbor] += 1 queue = [node for node in graph if in_degree[node] == 0] visited = set(queue) while queue: node = queue.pop(0) for neighbor in graph[node]: in_degree[neighbor] -= 1 if in_degree[neighbor] == 0: queue.append(neighbor) visited.add(neighbor) return len(visited) != len(graph) ``` 以上就是 Python 两种基本的有向图环路查找算法。如果您需要更加高效的实现,建议使用 Tarjan 算法或 Kosaraju 算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值