您的位置:首页 > 其它

拓扑排序的简单实现

2016-10-24 10:12 190 查看

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



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



算法步骤解析:

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

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

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

代码如下:

//节点数为n,用邻接矩阵gragh

存储边权,用indegree
存储每个节点的入度

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);

                        }

                }       

        }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: