案例例题: 某公司计划开展一项新项目,该项目包含若干个子任务,每个子任务都有一个预计的完成时间。为了保证项目能够按时完成,需要确定关键路径,即完成整个项目所需的最短时间。

假设项目中的子任务如下: 任务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的最晚完成时间为:

给出一个关键路径的案例例题并运用数据结构知识编写一个C语言代码要求有输入输出。

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

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