取入度为零的顶点v; while (v<>0) { printf(v); ++m; w:=FirstAdj(v); while (w<>0) { inDegree[w]--; w:=nextAdj(v,w); } 取下一个入度为零的顶点v; } if m<n printf(“图中有回路”);
为了避免每次搜索入度为0的顶点,可以用一个栈来保存所有入度为0的点。
1 2 3 4 5 6 7 8 9 10 11 12 13
CountInDegree(G,indegree);//对各顶点求入度 InitStack(S); for ( i = 0; i < G.vexnum; ++ i) if (!indegree[i]) Push(S, i);//入度为零的顶点入栈 count=0; //对输出顶点计数 while (!EmptyStack(S)) { Pop(S, v); ++ count; printf(v); for (w = FirstAdj(v); w; w = NextAdj(G,v,w)){ -- indegree(w); // 弧头顶点的入度减一 if (!indegree[w]) Push(S, w); //新产生的入度为零的顶点入栈 } } if (count < G.vexnum) printf(“图中有回路”)