#include stdioh#include stdlibh#define MAX_WORKS 9 定义图的节点typedef struct Node int num; 节点编号 int time; 工作时间 int earliest_start; 最早开始时间 int latest_start; 最晚开始时间 int earliest_finish;
根据代码和报错信息,可以看出works数组的第9行存在问题。works数组的第9行应该是{2, 1, 1, 3, 6, 7},但是在代码中写成了{2, 1, 1, 3, 6, 7, 0},多了一个多余的0。因此,将works数组的第9行改为{2, 1, 1, 3, 6, 7}即可。
修改后的代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAX_WORKS 9
// 定义图的节点
typedef struct Node {
int num; // 节点编号
int time; // 工作时间
int earliest_start; // 最早开始时间
int latest_start; // 最晚开始时间
int earliest_finish; // 最早完成时间
int latest_finish; // 最晚完成时间
} Node;
// 创建有向图的邻接表表示
void createGraph(Node graph[], int works[][3], int n) {
for (int i = 0; i < n; i++) {
graph[i].num = i;
graph[i].time = works[i][0];
graph[i].earliest_start = 0;
graph[i].latest_start = 0;
graph[i].earliest_finish = 0;
graph[i].latest_finish = 0;
}
}
// 拓扑排序
void topologicalSort(Node graph[], int n, int works[][3]) {
int inDegree[MAX_WORKS] = {0}; // 入度数组
int queue[MAX_WORKS], front = 0, rear = 0; // 队列
int count = 0; // 计数器
// 初始化入度数组
for (int i = 0; i < n; i++) {
for (int j = 1; j < works[i][2]; j++) {
inDegree[works[i][j]]++;
}
}
// 将入度为0的节点入队列
for (int i = 0; i < n; i++) {
if (inDegree[i] == 0) {
queue[rear++] = i;
}
}
// 拓扑排序计算最早开始时间
while (front != rear) {
int current = queue[front++];
graph[current].earliest_finish = graph[current].earliest_start + graph[current].time;
count++;
for (int i = 0; i < n; i++) {
if (works[i][1] == current) {
inDegree[graph[i].num]--;
if (inDegree[graph[i].num] == 0) {
queue[rear++] = graph[i].num;
}
if (graph[current].earliest_finish > graph[i].earliest_start) {
graph[i].earliest_start = graph[current].earliest_finish;
}
}
}
}
// 计算最晚开始时间和最晚完成时间
graph[n - 1].latest_start = graph[n - 1].earliest_start;
graph[n - 1].latest_finish = graph[n - 1].earliest_finish;
for (int i = n - 2; i >= 0; i--) {
int earliest_start = graph[i].earliest_finish - graph[i].time;
for (int j = 0; j < n; j++) {
if (works[j][1] == i) {
if (graph[j].latest_finish == 0) {
graph[j].latest_finish = graph[j].earliest_finish;
}
if (graph[j].latest_start == 0) {
graph[j].latest_start = graph[j].earliest_start;
}
if (graph[j].latest_start > earliest_start) {
graph[j].latest_start = earliest_start;
}
}
}
graph[i].latest_start = graph[i].latest_finish - graph[i].time;
}
}
// 输出关键路径
void printCriticalPath(Node graph[], int n, int works[][3]) {
printf("关键路径为:\n");
for (int i = 0; i < n; i++) {
if (graph[i].earliest_start == graph[i].latest_start) {
printf("%c -> ", 'A' + i);
}
}
printf("%c\n", 'A' + n - 1);
printf("该项目最迟开始时间为:%d\n", graph[n - 1].latest_start);
}
int main() {
int works[MAX_WORKS][3] = {
{3, 0, 0},
{2, 0, 0},
{4, 0, 0},
{5, 1, 1},
{8, 1, 1},
{3, 2, 2},
{5, 3, 3},
{10, 4, 4},
{2, 1, 1, 3, 6, 7}
};
Node graph[MAX_WORKS];
createGraph(graph, works, MAX_WORKS);
topologicalSort(graph, MAX_WORKS, works);
printCriticalPath(graph, MAX_WORKS, works);
return 0;
}
``
原文地址: https://www.cveoy.top/t/topic/h3YJ 著作权归作者所有。请勿转载和采集!