有向图采用邻接矩阵存储,设计算法,判断其中是否存在回路
时间: 2024-12-13 22:16:16 浏览: 50
判断给定有向图是否存在回路.zip_判定有向图是否存在回路
有向图采用邻接矩阵存储时,可以借助深度优先搜索(Depth-First Search, DFS)或广度优先搜索(Breadth-First Search, BFS)来判断是否存在回路。这里我们介绍一种基于DFS的方法:
1. **DFS算法**:
- 初始化:从任意一个顶点`v`开始,将其标记为已访问(通常设为true),并将它放入栈(或递归调用堆栈)中。
- 遍历:循环处理栈顶的顶点,对于每个未访问过的邻接顶点`u`:
- 将`u`标记为已访问,并记录下当前路径。
- 如果`u`还没有被添加到当前路径中(这意味着我们可能找到了一个新的路径),继续查找其邻接节点。
- 如果`u`已经存在并且路径包含从`v`到`u`的边,那么就找到了回路,因为有向图中不可能从一个节点经过自身形成环。
- 当遍历完所有可能的路径后,如果没有发现回路,则图中不存在回路。
```python
def hasCycle(adj_matrix):
visited = [False] * len(adj_matrix)
stack = []
def dfs(v):
visited[v] = True
stack.append(v)
for u in range(len(adj_matrix[v])):
if not visited[u] and adj_matrix[v][u]: # 如果邻接且未访问
if dfs(u): # 发现回路
return True
elif stack[-1] == u: # 如果当前节点已在栈中,意味着形成了环
return True
stack.pop()
return False
for v in range(len(adj_matrix)):
if not visited[v]:
if dfs(v):
return True
return False
```
阅读全文