"#include<stdio.h>\n\n#define MAX_SIZE 10\n\n// 结构体定义\ntypedef struct {\n char name; \n int duration; \n int earliestStart; \n int latestStart; \n int slack; \n char dependent[MAX_SIZE]; \n int dependentCount; \n} Activity; \n\n// 全局变量定义\nActivity activities[MAX_SIZE]; \nint activityCount = 0; \nint maxDuration = 0; \n\n// 添加活动\nvoid addActivity(char name, int duration, char* dependent) { \n activities[activityCount].name = name; \n activities[activityCount].duration = duration; \n activities[activityCount].dependentCount = 0; \n\n // 解析依赖活动\n int i = 0; \n while(dependent[i] != '\0') { \n activities[activityCount].dependent[activities[activityCount].dependentCount] = dependent[i]; \n activities[activityCount].dependentCount++; \n i++; \n } \n\n activityCount++; \n} \n\n// 计算最早开始时间\nvoid calculateEarliestStart() { \n activities[0].earliestStart = 0; \n\n for(int i = 1; i < activityCount; i++) { \n int maxStart = 0; \n for(int j = 0; j < activities[i].dependentCount; j++) { \n char dependent = activities[i].dependent[j]; \n for(int k = 0; k < activityCount; k++) { \n if(activities[k].name == dependent && activities[k].earliestStart + activities[k].duration > maxStart) { \n maxStart = activities[k].earliestStart + activities[k].duration; \n } \n } \n } \n\n activities[i].earliestStart = maxStart; \n if(maxStart + activities[i].duration > maxDuration) { \n maxDuration = maxStart + activities[i].duration; \n } \n } \n} \n\n// 计算最晚开始时间和关键路径\nvoid calculateLatestStart() { \n activities[activityCount - 1].latestStart = activities[activityCount - 1].earliestStart; \n\n for(int i = activityCount - 2; i >= 0; i--) { \n int minStart = maxDuration; \n for(int j = 0; j < activities[i].dependentCount; j++) { \n char dependent = activities[i].dependent[j]; \n for(int k = 0; k < activityCount; k++) { \n if(activities[k].name == dependent && activities[k].latestStart - activities[i].duration < minStart) { \n minStart = activities[k].latestStart - activities[i].duration; \n } \n } \n } \n\n activities[i].latestStart = minStart; \n activities[i].slack = activities[i].latestStart - activities[i].earliestStart; \n } \n} \n\n// 输出关键路径\nvoid printCriticalPath() { \n printf("关键路径: "); \n\n for(int i = 0; i < activityCount; i++) { \n if(activities[i].slack == 0) { \n printf("%c ", activities[i].name); \n } \n } \n\n printf("\n"); \n} \n\nint main() { \n // 添加活动\n addActivity('A', 3, ""); \n addActivity('B', 2, "A"); \n addActivity('C', 4, "A"); \n addActivity('D', 5, "B"); \n addActivity('E', 8, "B"); \n addActivity('F', 3, "C"); \n addActivity('G', 5, "F"); \n addActivity('H', 10, "E"); \n addActivity('I', 2, "DGH"); \n\n // 计算最早开始时间\n calculateEarliestStart(); \n\n // 计算最晚开始时间和关键路径\n calculateLatestStart(); \n\n // 输出关键路径\n printCriticalPath(); \n\n printf("项目最迟开始时间: %d\n", maxDuration); \n\n return 0; \n}


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

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