"#include" <stdio.h> "#include" <stdlib.h>

// 定义活动的结构体 typedef struct { char name; int duration; int earliestStart; int latestStart; int critical; int numOfPredecessors; char *predecessors; } Activity;

// 计算关键路径的函数 void calculateCriticalPath(Activity *activities, int numActivities) { int i, j, k; int maxDuration = 0;

// 初始化最早开始时间和最晚开始时间
for (i = 0; i < numActivities; i++) {
    activities[i].earliestStart = 0;
    activities[i].latestStart = INT_MAX;
}

// 计算每个活动的最早开始时间
for (i = 0; i < numActivities; i++) {
    for (j = 0; j < activities[i].numOfPredecessors; j++) {
        k = activities[i].predecessors[j] - 'A';
        if (activities[k].duration + activities[k].earliestStart > activities[i].earliestStart) {
            activities[i].earliestStart = activities[k].duration + activities[k].earliestStart;
        }
    }
}

// 计算项目的最长时间
for (i = 0; i < numActivities; i++) {
    if (activities[i].duration + activities[i].earliestStart > maxDuration) {
        maxDuration = activities[i].duration + activities[i].earliestStart;
    }
}

// 计算每个活动的最晚开始时间
for (i = numActivities - 1; i >= 0; i--) {
    for (j = 0; j < activities[i].numOfPredecessors; j++) {
        k = activities[i].predecessors[j] - 'A';
        if (activities[i].latestStart - activities[i].duration < activities[k].latestStart) {
            activities[k].latestStart = activities[i].latestStart - activities[i].duration;
        }
    }
}

// 标记关键路径
for (i = 0; i < numActivities; i++) {
    if (activities[i].earliestStart == activities[i].latestStart) {
        activities[i].critical = 1;
    } else {
        activities[i].critical = 0;
    }
}

// 输出关键路径
printf("关键路径为:");
for (i = 0; i < numActivities; i++) {
    if (activities[i].critical) {
        printf("%c ", activities[i].name);
    }
}
printf("\n");

// 输出项目最迟开始时间
printf("项目最迟开始时间为:%d\n", maxDuration);

}

int main() { int numActivities = 9; Activity activities[numActivities];

// 初始化活动列表
activities[0].name = 'A';
activities[0].duration = 3;
activities[0].numOfPredecessors = 0;

activities[1].name = 'B';
activities[1].duration = 2;
activities[1].numOfPredecessors = 1;
activities[1].predecessors = (char *)malloc(sizeof(char));
*(activities[1].predecessors) = 'A';

activities[2].name = 'C';
activities[2].duration = 4;
activities[2].numOfPredecessors = 1;
activities[2].predecessors = (char *)malloc(sizeof(char));
*(activities[2].predecessors) = 'A';

activities[3].name = 'D';
activities[3].duration = 5;
activities[3].numOfPredecessors = 1;
activities[3].predecessors = (char *)malloc(sizeof(char));
*(activities[3].predecessors) = 'B';

activities[4].name = 'E';
activities[4].duration = 8;
activities[4].numOfPredecessors = 1;
activities[4].predecessors = (char *)malloc(sizeof(char));
*(activities[4].predecessors) = 'B';

activities[5].name = 'F';
activities[5].duration = 3;
activities[5].numOfPredecessors = 1;
activities[5].predecessors = (char *)malloc(sizeof(char));
*(activities[5].predecessors) = 'C';

activities[6].name = 'G';
activities[6].duration = 5;
activities[6].numOfPredecessors = 1;
activities[6].predecessors = (char *)malloc(sizeof(char));
*(activities[6].predecessors) = 'F';

activities[7].name = 'H';
activities[7].duration = 10;
activities[7].numOfPredecessors = 1;
activities[7].predecessors = (char *)malloc(sizeof(char));
*(activities[7].predecessors) = 'E';

activities[8].name = 'I';
activities[8].duration = 2;
activities[8].numOfPredecessors = 3;
activities[8].predecessors = (char *)malloc(3 * sizeof(char));
activities[8].predecessors[0] = 'D';
activities[8].predecessors[1] = 'G';
activities[8].predecessors[2] = 'H';

calculateCriticalPath(activities, numActivities);

return 0;

}

C++ 关键路径算法实现:示例代码及优化

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

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