采用邻接表存储,实现关键路径算法具体代码
时间: 2023-12-10 17:40:58 浏览: 89
关键路径算法是一种用于确定项目完成所需时间的技术,其重点在于找出各个活动的最早开始时间、最晚开始时间、总时差和自由时差。在实现时采用邻接表存储有向无环图(DAG),具体代码如下:
```python
from collections import defaultdict
class Graph:
def __init__(self, vertices):
self.graph = defaultdict(list)
self.vertices = vertices
self.indegree = [0] * vertices
self.topo_order = []
self.start_time = [0] * vertices
self.end_time = [0] * vertices
self.critical_path = []
def add_edge(self, u, v, weight):
self.graph[u].append((v, weight))
self.indegree[v] += 1
def get_indegree(self, v):
return self.indegree[v]
def get_topo_order(self):
return self.topo_order
def get_start_time(self, v):
return self.start_time[v]
def get_end_time(self, v):
return self.end_time[v]
def get_critical_path(self):
return self.critical_path
def topological_sort(self):
queue = []
for i in range(self.vertices):
if self.indegree[i] == 0:
queue.append(i)
while queue:
u = queue.pop(0)
self.topo_order.append(u)
for v, weight in self.graph[u]:
self.indegree[v] -= 1
if self.indegree[v] == 0:
queue.append(v)
self.start_time[v] = max(self.start_time[v], self.end_time[u])
self.end_time[u] = max(self.end_time[u], self.start_time[u] + weight)
def find_critical_path(self):
for u in range(self.vertices):
for v, weight in self.graph[u]:
if self.start_time[u] + weight == self.start_time[v]:
self.critical_path.append((u, v, weight))
if __name__ == '__main__':
g = Graph(7)
g.add_edge(0, 1, 3)
g.add_edge(0, 2, 2)
g.add_edge(1, 3, 4)
g.add_edge(2, 3, 2)
g.add_edge(3, 4, 4)
g.add_edge(3, 5, 3)
g.add_edge(4, 6, 2)
g.add_edge(5, 6, 1)
g.topological_sort()
g.find_critical_path()
print("Topological order:", g.get_topo_order())
print("Start time:", g.start_time)
print("End time:", g.end_time)
print("Critical path:", g.get_critical_path())
```
在上述代码中,我们首先定义了一个 Graph 类,其中包含邻接表、顶点数、每个顶点的入度、拓扑排序后的顺序、每个顶点的最早开始时间、最晚开始时间、关键路径等信息。然后定义了一些方法,包括添加边、获取入度、获取拓扑排序后的顺序、获取最早开始时间、最晚开始时间和关键路径等。其中,topological_sort() 方法实现了拓扑排序,find_critical_path() 方法实现了查找关键路径。
在主函数中,我们定义了一个 7 个顶点的 DAG,并添加了各个顶点之间的边。然后调用 topological_sort() 方法进行拓扑排序,再调用 find_critical_path() 方法查找关键路径。最后输出了拓扑排序后的顺序、每个顶点的最早开始时间、最晚开始时间和关键路径等信息。
阅读全文