根据代码和报错信息,可以看出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;
}
``
#include stdioh#include stdlibh#define MAX_WORKS 9 定义图的节点typedef struct Node int num; 节点编号 int time; 工作时间 int earliest_start; 最早开始时间 int latest_start; 最晚开始时间 int earliest_finish;

原文地址: https://www.cveoy.top/t/topic/h3YJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录