拓扑排序——C语言

拓扑排序就是由某个集合上的一个偏序得到该集合上的一个全序。

某个集合的偏序就是指集合中仅有部分成员之间可比较,而全序是集合中全部成员都可以进行比较。可以进行拓扑排序的需要是一个有向无环图。

对一个图进行拓扑排序,就要进行以下几个步骤:

(1)在有向图中选一个没有前驱的顶点并输入之;

(2)从图中删除该顶点和所有以它为尾的弧;

重复这两个步骤,直到所有顶点均以输出(拓扑排序成功),或者当前图中不存在无前驱的顶点为止(说明图中存在环,无法进行排序)                                      (出自严蔚敏版数据结构)              《拓扑排序——C语言》

用代码实现以上操作时,采用栈来实现顶点的输出。循环查找入度为0的顶点入栈,最后对入栈顶点进行统计,若小于顶点数,则说明图存在有向环;若等于顶点数,则说明拓扑排序成功。

代码实现:

/**拓扑排序**/
void topo(ArrayGraph *G,int N)
{
    int indegree[N]={0};///入度矩阵
    int sortor[N]={0};///用于存放排序的序列
    int sortc=0;
    int stact[N];
    int cure=N+1;
    inits(stact,cure);
    int coun=0;///用来统计入度为0的顶点数
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
            indegree[i]+=G->arcs[i][j];
        if(!(indegree[i]))
            push(stact,cure,i);///入度为0的顶点入栈
    }
    while(!isempty(stact,cure))
    {
        int t;
        t=pop(stact,cure);
        sortor[sortc++]=t;
        coun++;
        for(int i=0;i<N;i++)
        {
            if(indegree[i]==1&&G->arcs[t][i]==1)
                push(stact,cure,i);///入度为0的顶点入栈
            indegree[i]-=G->arcs[t][i];///将出栈顶点所指向的顶点-1
        }
    }
    if(coun==N)
    {
        printf(“\n拓扑排序为:”);
        for(int i=0;i<N;i++)
            printf(” %d “,sortor[i]+1);
    }
    else
    {
        printf(“\n此图有回路,无法进行拓扑排序”);
    }
}

运行结果:

  《拓扑排序——C语言》                    《拓扑排序——C语言》

时间复杂度:O(n+e)

第一个循环入栈的时间复杂度为O(n),在拓扑排序过程中,若图为无环图,那么每个顶点进栈,出栈,入度-1的操作在while中总共执行e次,所以总时间复杂度为O(n+e)。

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/jin_jue_qi/article/details/82817280
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞