给出一个关键路径的案例例题并运用数据结构知识编写一个C语言代码要求有输入输出。
案例例题: 某公司计划开展一项新项目,该项目包含若干个子任务,每个子任务都有一个预计的完成时间。为了保证项目能够按时完成,需要确定关键路径,即完成整个项目所需的最短时间。
假设项目中的子任务如下: 任务A:预计完成时间为3天,没有前置任务 任务B:预计完成时间为5天,前置任务为A 任务C:预计完成时间为2天,前置任务为A 任务D:预计完成时间为4天,前置任务为B和C 任务E:预计完成时间为6天,前置任务为D
编写一个C语言代码,根据输入的任务信息,计算出关键路径,并输出整个项目的最短时间。
代码如下:
#include <stdio.h>
#define MAX_TASKS 10
typedef struct {
char name;
int time;
int dependencies[MAX_TASKS];
int numDependencies;
} Task;
int calculateEarliestTime(Task tasks[], int taskId) {
if (tasks[taskId].numDependencies == 0) {
return tasks[taskId].time;
}
int maxTime = 0;
for (int i = 0; i < tasks[taskId].numDependencies; i++) {
int dependencyId = tasks[taskId].dependencies[i];
int dependencyTime = calculateEarliestTime(tasks, dependencyId);
if (dependencyTime > maxTime) {
maxTime = dependencyTime;
}
}
return maxTime + tasks[taskId].time;
}
int calculateLatestTime(Task tasks[], int taskId, int projectTime) {
if (tasks[taskId].numDependencies == 0) {
return projectTime - tasks[taskId].time;
}
int minTime = projectTime;
for (int i = 0; i < tasks[taskId].numDependencies; i++) {
int dependencyId = tasks[taskId].dependencies[i];
int dependencyTime = calculateLatestTime(tasks, dependencyId, projectTime);
if (dependencyTime < minTime) {
minTime = dependencyTime;
}
}
return minTime - tasks[taskId].time;
}
int main() {
int numTasks;
printf("请输入任务数量:");
scanf("%d", &numTasks);
Task tasks[MAX_TASKS];
for (int i = 0; i < numTasks; i++) {
printf("请输入任务名称:");
scanf(" %c", &tasks[i].name);
printf("请输入预计完成时间:");
scanf("%d", &tasks[i].time);
printf("请输入前置任务数量:");
scanf("%d", &tasks[i].numDependencies);
printf("请输入前置任务编号(用空格分隔):");
for (int j = 0; j < tasks[i].numDependencies; j++) {
scanf("%d", &tasks[i].dependencies[j]);
}
}
int projectTime = 0;
for (int i = 0; i < numTasks; i++) {
int taskEarliestTime = calculateEarliestTime(tasks, i);
if (taskEarliestTime > projectTime) {
projectTime = taskEarliestTime;
}
}
printf("整个项目的最短时间为:%d\n", projectTime);
for (int i = 0; i < numTasks; i++) {
int taskLatestTime = calculateLatestTime(tasks, i, projectTime);
printf("任务%c的最晚完成时间为:%d\n", tasks[i].name, taskLatestTime);
}
return 0;
}
输入示例: 请输入任务数量:5 请输入任务名称:A 请输入预计完成时间:3 请输入前置任务数量:0 请输入任务名称:B 请输入预计完成时间:5 请输入前置任务数量:1 请输入前置任务编号(用空格分隔):0 请输入任务名称:C 请输入预计完成时间:2 请输入前置任务数量:1 请输入前置任务编号(用空格分隔):0 请输入任务名称:D 请输入预计完成时间:4 请输入前置任务数量:2 请输入前置任务编号(用空格分隔):1 2 请输入任务名称:E 请输入预计完成时间:6 请输入前置任务数量:1 请输入前置任务编号(用空格分隔):3
输出示例: 整个项目的最短时间为:16 任务A的最晚完成时间为:0 任务B的最晚完成时间为:11 任务C的最晚完成时间为:14 任务D的最晚完成时间为:12 任务E的最晚完成时间为:
原文地址: http://www.cveoy.top/t/topic/hWJA 著作权归作者所有。请勿转载和采集!