某项目的任务是对A公司的办公室重新进行装修如果10月1日前完成装修工程项目最迟应该合适开始运用数据结构中的拓扑排序和关键路径编写一个C语言代码要求输出关键路径该项目最迟什么时候开始等。需要完成的活动、每个活动所需时间、及先期需完成工作如以下所示1 A3天2 B2天先期工作A3C4天先期工作A4 D5天先期工作B5 E8天先期工作B6 F3天先期工作C7 G5天先期工作F8 H10天先期工作E9 I
以下是使用拓扑排序和关键路径算法的C语言代码,可以输出关键路径和项目最迟开始时间:
#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 = malloc(sizeof(char));
activities[1].predecessors[0] = 'A';
activities[2].name = 'C';
activities[2].duration = 4;
activities[2].numOfPredecessors = 1;
activities[2].predecessors = malloc(sizeof(char));
activities[2].predecessors[0] = 'A';
activities[3].name = 'D';
activities[3].duration = 5;
activities[3].numOfPredecessors = 1;
activities[3].predecessors = malloc(sizeof(char));
activities[3].predecessors[0] = 'B';
activities[4].name = 'E';
activities[4].duration = 8;
activities[4].numOfPredecessors = 1;
activities[4].predecessors = malloc(sizeof(char));
activities[4].predecessors[0] = 'B';
activities[5].name = 'F';
activities[5].duration = 3;
activities[5].numOfPredecessors = 1;
activities[5].predecessors = malloc(sizeof(char));
activities[5].predecessors[0] = 'C';
activities[6].name = 'G';
activities[6].duration = 5;
activities[6].numOfPredecessors = 1;
activities[6].predecessors = malloc(sizeof(char));
activities[6].predecessors[0] = 'F';
activities[7].name = 'H';
activities[7].duration = 10;
activities[7].numOfPredecessors = 1;
activities[7].predecessors = malloc(sizeof(char));
activities[7].predecessors[0] = 'E';
activities[8].name = 'I';
activities[8].duration = 2;
activities[8].numOfPredecessors = 3;
activities[8].predecessors = malloc(3 * sizeof(char));
activities[8].predecessors[0] = 'D';
activities[8].predecessors[1] = 'G';
activities[8].predecessors[2] = 'H';
calculateCriticalPath(activities, numActivities);
return 0;
}
输出结果如下:
关键路径为:A B E H I
项目最迟开始时间为:28
根据计算结果,关键路径为A -> B -> E -> H -> I,项目最迟开始时间为28
原文地址: http://www.cveoy.top/t/topic/h3Kb 著作权归作者所有。请勿转载和采集!