zoukankan      html  css  js  c++  java
  • 【总结】拓扑排序

    拓扑排序

    一.拓扑排序是什么

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

    (以上来自百度百科)

    那么拓扑排序有什么用呢?

    ​ 拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。例如,在日常工作中,可能会将项目拆分成A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项目进行的顺序,可对这个关系集进行拓扑排序,得出一个线性的序列,则排在前面的任务就是需要先完成的任务。

    ​ 注意:这里得到的排序并不是唯一的!就好像你早上穿衣服可以先穿上衣也可以先穿裤子,只要里面的衣服在外面的衣服之前穿就行。

    二.算法的实现

    ​ 拓扑排序的定义听起来可能有些繁琐,但算法的实现还是非常简单的。

    ​ 只需要重复一下步骤直到不存在有入度为0的顶点即可:

    ​ (1)选择一个入度为0的点并且输出它

    ​ (2)删除我们刚刚输出的那个点以及它所有的出边

    ​ 当循环进行完这个流程的时候,输出的序列就是它的拓扑序。

    三.代码

    void sortt(){
        queue<int> q;//队列用来存当前
        for(int i = 1;i <= n;i ++)if(inn[i] == 0)q.push(i);
    
        while(q.size()){
            int u = q.front();
            q.pop();
            for(int i = 0;i < mmp[u].size();i++){
                inn[mmp[u][i].first]--;
                //if(bj[u] == 1){
                    //if (jl[mmp[u][i].first] < jl[u]+mmp[u][i].second) jl[mmp[u][i].first]=jl[u]+mmp[u][i].second;
                    //bj[mmp[u][i].first] = 1;
                //}
                if(inn[mmp[u][i].first] == 0)q.push(mmp[u][i].first);
            }
        }
        return ;
    }
    
  • 相关阅读:
    Redis 错误摘记篇
    搭建备份到业务迁移---mysql
    业务迁移---web
    业务迁移---redis
    redis 编译安装错误问题
    location 匹配规则 (NGINX)
    nginx虚拟目录实现两个后台使用
    零基础学python-19.10 生成器是单迭代器
    零基础学python-19.9 生成器函数与生成器表达式
    零基础学python-19.8 生成器表达式:当迭代器遇上列表解析
  • 原文地址:https://www.cnblogs.com/huixinxinw/p/12719602.html
Copyright © 2011-2022 走看看