一、题目描述
某学院有n门课程,(i,j)表示课程i是课程j的先行课,及课程i必须在课程j的之前的学期开设。对任意给出的仙子那个课解s={(1,3),(2,4),(3,5),(4,6),(3,7),…},至少需要安排多少个学期?给出每个学期的课程清单。
二、程序思路
分析题目能清楚地发现此题与拓扑排序有很大的关系,拓扑排序的层数就是学期数,每个学期的课程就是每一层的点。所以只需要在拓扑排序的程序上改改就好了。
三、具体实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| int linkedDgraph1::course(int **b) { int number=0; int n=verticeNumber; int *indegree=new int[num1+1]; for(int i=1;i<=num1;i++) indegree[i]=inDegree(i); stack<int> astack(10000); while(n!=0) { int j=0; for(int i=1;i<=num1;i++) { if(indegree[i]==0) { b[number][j++]=i; astack.push(i); } } number++; while(!astack.empty()) { int t=astack.top(); n--; indegree[t]=-1; astack.pop(); for(int i=1;i<=num1;i++) if(existsEdge(t,i)) indegree[i]--; } } return number; }
|
四、结果展示


五、说明
本程序所用图的结构为邻接链表。