void TopologicalSort(ALGraph G) { Stack S, OutCome; InitStack(&S); InitStack(&OutCome); //寻找入读为0的顶点入栈 for (int i = 0; i < G.VexNum; i++) { if (!G.InDegree[i]) { S.Vertics[S.tail++] = i; } } while (0 < S.tail) { int tmp = OutCome.Vertics[OutCome.tail++] = S.Vertics[--S.tail]; for (ArcNode* p = G.Vertics[tmp].FirstArc; NULL != p; p = p->Next) { G.InDegree[p->AdjVex]--; if (0 == G.InDegree[p->AdjVex]) S.Vertics[S.tail++] = p->AdjVex; } } if (OutCome.tail != G.VexNum) { printf("课程的先决条件有误!\n"); exit(EXIT_FAILURE); } printf("请输入分配课程要求(各学期负担集中:1 尽可能集中前几个学期:2):"); int Command; scanf("%d", &Command); switch (Command) { case 1: Method1(G, OutCome); break; case 2: Method2(G); break; default: { printf("命令错误!"); exit(EXIT_FAILURE); } } getch(); main(); }代码流程思路
时间: 2024-01-29 08:02:03 浏览: 86
绘制公司在技术空间中的位置:专利统计的拓扑分析-研究论文
该函数的主要功能是对给定的有向图G进行拓扑排序,并根据用户输入的要求进行课程分配。
具体流程如下:
1. 初始化两个栈S和OutCome,用于存储拓扑排序的结果和已经处理的顶点。
2. 遍历有向图G中的每个顶点,将入度为0的顶点入栈S中。
3. 当栈S不为空时,循环执行以下操作:
- 取出栈S中的一个顶点tmp,将其加入栈OutCome中。
- 遍历顶点tmp的所有邻接点p->AdjVex,并将其入度减1。
- 如果邻接点p->AdjVex的入度为0,将其加入栈S中。
4. 如果栈OutCome的元素个数不等于有向图G的顶点数,说明有向图中存在环,拓扑排序失败,输出错误信息并退出程序。
5. 提示用户输入分配课程的要求(1代表各学期负担集中,2代表尽可能集中前几个学期)。
6. 根据用户输入的要求,调用相应的方法,进行课程分配。
7. 循环结束后,通过getch()等待用户按下任意键后重新进入main函数。
阅读全文