/*
拓扑排序方法如下:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
*/
bool TopologicalSort(int a[][101]){ //可以完成拓扑排序则返回True
int n = a[0][0], i, j;
int into[101], ans[101];
memset(into, 0, sizeof(into));
memset(ans, 0, sizeof(ans));
for (i = 1; i <= n; i++){
for (j = 1; j <= n; j++){
if (a[i][j] > 0)
into[j]++;//算入度
}
}
into[0] = 1;
for (i = 1; i <= n; i++){
j = 0;
while (into[j] != 0){
j++; //找入度为0的节点j
if (j > n)
return false;
}
ans[i] = j; //将j点排入序列中
into[j] = -1; //将j点入度置为-1
for (int k = 1; k <= n; k++){
if (a[j][k] > 0)
into[k]--; //删除节点后j后与它相连的点的入度相应的减少
}
}
for (i = 1; i <= n; i++){
cout << ans[i] << " "; //打印拓扑排序结果
}
cout << endl;
return true;
}