拓扑排序的简单实现



对一个有向无环图(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]存储每个节点的入度

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

                        }

                }       

        }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值