C语言实现拓扑排序:项目任务依赖关系案例
#include <stdio.h>\n#include <stdbool.h>\n\n#define MAX_TASKS 5\n\n// 定义任务的结构体\ntypedef struct {\n char name; \n bool isVisited; \n int dependCount; \n int dependTasks[MAX_TASKS]; \n} Task; \n\n// 初始化任务\nvoid initTasks(Task tasks[]) { \n int i; \n for (i = 0; i < MAX_TASKS; i++) { \n tasks[i].name = 'A' + i; \n tasks[i].isVisited = false; \n tasks[i].dependCount = 0; \n } \n tasks[1].dependCount = 1; \n tasks[1].dependTasks[0] = 0; \n tasks[2].dependCount = 2; \n tasks[2].dependTasks[0] = 0; \n tasks[2].dependTasks[1] = 1; \n tasks[3].dependCount = 2; \n tasks[3].dependTasks[0] = 2; \n tasks[3].dependTasks[1] = 4; \n} \n\n// 拓扑排序\nvoid topologicalSort(Task tasks[], int sortedTasks[], int *sortedCount) { \n int i, j, k; \n int indegree[MAX_TASKS] = {0}; \n\n // 计算入度\n for (i = 0; i < MAX_TASKS; i++) { \n for (j = 0; j < tasks[i].dependCount; j++) { \n indegree[tasks[i].dependTasks[j]]++; \n } \n } \n\n // 拓扑排序\n for (i = 0; i < MAX_TASKS; i++) { \n // 找到入度为0的任务\n for (j = 0; j < MAX_TASKS; j++) { \n if (indegree[j] == 0 && !tasks[j].isVisited) { \n sortedTasks[*sortedCount] = j; \n (*sortedCount)++; \n tasks[j].isVisited = true; \n // 更新依赖该任务的任务的入度\n for (k = 0; k < tasks[j].dependCount; k++) { \n indegree[tasks[j].dependTasks[k]]--; \n } \n break; \n } \n } \n } \n} \n\nint main() { \n Task tasks[MAX_TASKS]; \n int sortedTasks[MAX_TASKS]; \n int sortedCount = 0; \n int i; \n\n initTasks(tasks); \n topologicalSort(tasks, sortedTasks, &sortedCount); \n\n printf("拓扑排序结果:"); \n for (i = 0; i < sortedCount; i++) { \n printf("%c ", tasks[sortedTasks[i]].name); \n } \n printf("\n"); \n\n return 0; \n}
原文地址: https://www.cveoy.top/t/topic/pEZA 著作权归作者所有。请勿转载和采集!