拓扑排序的简单实现



对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

上图的一种可能的拓扑排序为

算法步骤解析:

1.从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它;

2.从网中删去该顶点,并且删去从该顶点发出的全部有向边;

3.重复以上两步,直到剩余的网中不再存在没有前驱的顶点为止。


代码如下:

//节点数为n,用邻接矩阵gragh[n][n]存储边权,用indegree[n]存储每个节点的入度

扫描二维码关注公众号,回复: 3527856 查看本文章

void topologic(int *toposort)

{

        int cnt = 0; //当前拓扑排序列表中有多少节点

        queue<int> q; //保存入度为0的节点

        int i;

        for(i = 0; i < n; i++)

        {

                if(indegree[i] == 0)

                       q.push(i);

        }

        int cur; //当前入度为0的节点

        while(!q.empty())

        {

                cur = q.front();

                q.pop();

                toposort[cnt++] = cur;

                for(i = 0; i < n; i++)

                {

                        if(gragh[cur][i] != 0)

                        {

                                 indegree[i] --;

                                 if(indegree[i] == 0)

                                       q.push(i);

                        }

                }       

        }

}


猜你喜欢

转载自blog.csdn.net/liu_xiao_cheng/article/details/52908772