Write a program to find the topological order in a digraph.
//求各节点入度1 -- code is ok
void Get_indegree_all_vertex(LGraph Graph, int *indegree)
{
for (int i = 0; i < Graph->Nv; i++)
indegree[i] = 0;
for (int i = 0; i < Graph->Nv; i++)
{
PtrToAdjVNode p = Graph->G[i].FirstEdge;
while (p)
{
indegree[p->AdjV]++;
p = p->Next;
}
}
}
bool TopSort( LGraph Graph, Vertex TopOrder[] )
{
int indegree[MaxVertexNum];
//cnt记录存了多少个,cur记录当前访问到哪个节点
int cnt = 0, cur = 0;
Get_indegree_all_vertex(Graph, indegree);
//清空TopOrder数组
for (int i = 0; i < Graph->Nv; i++) TopOrder[i] = 0;
//查找入度为0的节点(可能有多个),放到数组里
for (int i = 0; i < Graph->Nv; i++)
if (!indegree[i]) TopOrder[cnt++] = i;
//数组访问完的时候退出
while (cur != cnt)
{
//取出之后cur要++
Vertex cur_vertex = TopOrder[cur];
cur++;
for (PtrToAdjVNode p = Graph->G[cur_vertex].FirstEdge; p != NULL; p = p->Next)
{
indegree[p->AdjV]--;
if (indegree[p->AdjV] == 0)
{
//printf("%d is push into TopOrder\n", p->AdjV);
TopOrder[cnt++] = p->AdjV;
}
}
}
//printf("[%d]\n", cnt);
if (cnt < Graph->Nv) return false;
else return true;
}