拓扑排序

来源:互联网 发布:小米怎么看网络制式 编辑:程序博客网 时间:2024/05/17 22:18
【定义】
        拓扑排序,适用于有向无环图(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;
}
0 0