编程题: 在一个有向图中: 1、不用拓扑排序,请设计算法判断该图中是否存在回路。请先写明算法思想,再完成相应的功能函数的定义。 2、判断指定的两个结点是否相互连通(即是否相互之间存在路径)。请先写明算法思想,再完成相应的功能函数的定义。
时间: 2024-05-02 09:16:24 浏览: 65
1、算法思想:
可以使用深度优先搜索(DFS)来判断有向图中是否存在回路。具体实现方法为,在搜索过程中,对于每个节点,如果在搜索过程中发现该节点已经被访问过但是还没有被回溯(即还在递归栈中),那么说明存在回路。
2、算法思想:
同样可以使用深度优先搜索(DFS)来判断有向图中两个节点之间是否存在路径。具体实现方法为,在搜索过程中,对于每个节点,如果该节点与目标节点相同,那么说明存在路径;如果该节点还没有被访问过,那么继续递归搜索该节点的所有邻居节点,直到找到目标节点或者所有相关节点都被访问过为止。
具体实现代码如下:
```python
# 定义有向图类
class DirectedGraph:
def __init__(self, vertices):
self.vertices = vertices # 所有节点
self.edges = {} # 所有边,用邻接表表示
# 添加边
def add_edge(self, start, end):
if start not in self.vertices:
self.vertices.append(start)
if end not in self.vertices:
self.vertices.append(end)
if start not in self.edges:
self.edges[start] = []
self.edges[start].append(end)
# 判断是否存在回路
def has_cycle(self):
visited = set() # 记录已经被访问过的节点
rec_stack = set() # 记录递归栈中的节点
# DFS搜索
def dfs(node):
visited.add(node)
rec_stack.add(node)
if node in self.edges:
for neighbor in self.edges[node]:
if neighbor not in visited:
if dfs(neighbor):
return True
elif neighbor in rec_stack:
return True
rec_stack.remove(node)
return False
for node in self.vertices:
if node not in visited:
if dfs(node):
return True
return False
# 判断两个节点是否相互连通
def is_connected(self, start, end):
visited = set() # 记录已经被访问过的节点
# DFS搜索
def dfs(node):
visited.add(node)
if node == end:
return True
if node in self.edges:
for neighbor in self.edges[node]:
if neighbor not in visited and dfs(neighbor):
return True
return False
return dfs(start)
```
示例用法:
```python
# 创建有向图对象
graph = DirectedGraph(['A', 'B', 'C', 'D', 'E'])
# 添加边
graph.add_edge('A', 'B')
graph.add_edge('B', 'C')
graph.add_edge('C', 'D')
graph.add_edge('D', 'E')
graph.add_edge('E', 'B')
# 判断是否存在回路
print(graph.has_cycle()) # True
# 判断节点之间是否相互连通
print(graph.is_connected('A', 'E')) # True
print(graph.is_connected('D', 'A')) # False
```
阅读全文