-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcourse-schedule-ii.c
37 lines (37 loc) · 1.21 KB
/
course-schedule-ii.c
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
35
36
37
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
// ref: https://en.wikipedia.org/wiki/Topological_sorting#Algorithms
int* findOrder(int numCourses, int** prerequisites, int prerequisitesRowSize, int prerequisitesColSize, int* returnSize) {
int *L, *S, *I, lenL = 0, lenS = 0, i;
L = (int*)calloc(3 * numCourses, sizeof(int));
S = L + numCourses;
I = S + numCourses;
for (i = 0; i < prerequisitesRowSize; ++i)
I[prerequisites[i][0]]++;
for (i = 0; i < numCourses; ++i)
if (I[i] == 0)
S[lenS++] = i;
while (lenS > 0) {
int n = L[lenL++] = S[--lenS];
int **pe = prerequisites + prerequisitesRowSize;
while (--pe >= prerequisites) {
int *e = *pe;
if (e[1] != n)
continue;
--prerequisitesRowSize;
*pe = prerequisites[prerequisitesRowSize];
prerequisites[prerequisitesRowSize] = e;
I[e[0]]--;
if (I[e[0]] == 0)
S[lenS++] = e[0];
}
}
if (prerequisitesRowSize > 0) {
free(L);
L = NULL;
} else
*returnSize = numCourses;
return L;
}