【定义】
拓扑排序,适用于有向无环图(AOV网)。
把 AOV 网中所有的活动排成一个序列,使每个活动的所有前驱活动都排在该活动之前,这个过程就是“拓扑排序”,所得到的序列就是拓扑序列。
(1)选择一个入度为0的定点输出。
(2)然后把删除以此节点为起点的所有关联边。转(1),直到不存在入度为0的节点。
(3)假如输出的顶点数小于AOV网的顶点,则有回路。
我们可以用邻接矩阵来删除所有的关联边,用栈来控制拓扑序列。
【程序】
# include <cstdio>
using namespace std;
int n,j,i,tot=0,tmp=0,num=0;
int r[101]; //入度
int c[101]; //出度
int a[101][101]; //邻接矩阵
int ans[101]; //栈
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
do{
scanf("%d",&j);
if(j!=0)
{
c[i]++; //点 i 的出度
a[i][c[i]]=j;
r[j]++; // 点 i 的入度
}
}while(j!=0);
}
for(i=1;i<=n;i++)
if(r[i]==0) ans[++tot]=i;//把AOV网中所有度为 0 的节点入栈
do{
tmp=ans[tot];
printf("%d ",tmp);
tot--; num++;//出栈并输出
for(i=1;i<=c[tmp];i++)
{
r[a[tmp][i]]--;//删除所有关联边
if(r[a[tmp][i]]==0) ans[++tot]=a[tmp][i];//如果入度减1为0,则入栈
}
}while(num!=n);//如果输出的点的数目等于AOV网的顶点数,就结束
return 0;
}