以下是一个使用Python实现关键路径计算的示例代码:
```python
from collections import defaultdict
class Graph:
def __init__(self, vertices):
self.graph = defaultdict(list)
self.V = vertices
def add_edge(self, u, v, w):
self.graph[u].append((v, w))
def topological_sort_util(self, v, visited, stack):
visited[v] = True
if v in self.graph.keys():
for node, weight in self.graph[v]:
if not visited[node]:
self.topological_sort_util(node, visited, stack)
stack.append(v)
def topological_sort(self):
visited = {v: False for v in self.V}
stack = []
for v in self.V:
if not visited[v]:
self.topological_sort_util(v, visited, stack)
return stack[::-1]
def longest_path(self, start):
topological_order = self.topological_sort()
dist = {v: float('-inf') for v in self.V}
dist[start] = 0
for v in topological_order:
if dist[v] != float('-inf'):
for node, weight in self.graph[v]:
new_dist = dist[v] + weight
if new_dist > dist[node]:
dist[node] = new_dist
return dist
g = Graph(['A', 'B', 'C', 'D', 'E', 'F'])
g.add_edge('A', 'B', 3)
g.add_edge('A', 'C', 2)
g.add_edge('B', 'D', 5)
g.add_edge('C', 'D', 7)
g.add_edge('C', 'E', 4)
g.add_edge('D', 'F', 6)
g.add_edge('E', 'F', 2)
start_node = 'A'
longest_paths = g.longest_path(start_node)
critical_path = []
for node, weight in longest_paths.items():
for next_node, next_weight in g.graph[node]:
if weight - next_weight == longest_paths[next_node]:
critical_path.append((node, next_node, weight))
print("关键路径为:", critical_path)
```
这个示例代码使用了拓扑排序和动态规划的思想,通过计算每个节点的最长路径来找到关键路径。其中,`Graph`类表示一个有向无环图,`add_edge`方法用于添加边,`topological_sort`方法用于进行拓扑排序,`longest_path`方法用于计算每个节点的最长路径。最后,通过比较每个节点的最长路径和相邻节点的边权值,找到关键路径。