在上述示例代码中,我们可以根据关键路径算法的逻辑,添加一些额外的代码来输出关键路径上的各个节点。
void findCriticalPath() {
vector<int> inDegree(numVertices, 0);
for (int u = 0; u < numVertices; ++u) {
for (auto& edge : adjacencyList[u]) {
int v = edge.first;
++inDegree[v];
}
}
vector<int> startTime(numVertices, 0);
vector<int> endTime(numVertices, 0);
queue<int> q;
for (int u = 0; u < numVertices; ++u) {
if (inDegree[u] == 0) {
q.push(u);
}
}
while (!q.empty()) {
int u = q.front();
q.pop();
for (auto& edge : adjacencyList[u]) {
int v = edge.first;
int weight = edge.second;
inDegree[v]--;
startTime[v] = max(startTime[v], startTime[u] + weight);
if (inDegree[v] == 0) {
q.push(v);
}
}
endTime[u] = startTime[u];
}
int criticalPathLength = *max_element(endTime.begin(), endTime.end());
cout << "Critical path length: " << criticalPathLength << endl;
// 输出关键路径上的节点
cout << "Critical path nodes: ";
int currentNode = -1;
for (int i = 0; i < numVertices; ++i) {
if (endTime[i] == criticalPathLength && currentNode == -1) {
currentNode = i;
cout << currentNode << " ";
} else if (endTime[i] == criticalPathLength && startTime[i] == startTime[currentNode]) {
currentNode = i;
cout << currentNode << " ";
}
}
cout << endl;
}
在findCriticalPath()
函数中,我们增加了一段代码来输出关键路径上的各个节点。这里使用了一个currentNode
变量来跟踪当前节点,并根据结束时间和开始时间进行判断,找到关键路径上的节点并输出。
这样,在调用graph.findCriticalPath()
之后,除了输出关键路径长度外,还会输出关键路径上的各个节点。
内容由零声教学AI助手提供,问题来源于学员提问