• 『拓扑排序』拓扑排序模板


    拓扑排序学习前提须知

    拓扑排序是对于一个图的所有节点进行排序,要求排序完后没有一个节点指向它前面的节点,那么这样我们就会得到一个拓扑排序后的数组,我们从后往前扫通过某种计算就能够得到从某一个点开始最多能到多少个点。

    算法内容

    竞赛需要用到的点

    1、拓扑排序仅适用于有向无环图,当然也可以判定是否图为无环图

    2、能够得到从一个点能到多少个其他的点,如果n在万以上,处理得当甚至能够过千万

    拓扑排序略讲

    拓扑排序需要满足一个很重要的条件就是,每次进入答案的点的入度一定为0,那么根据这个条件,我们就能得到我们的拓扑排序后的数组

    void toposort() {
        std::queue<int> q; //存储到目前为止入度为0的点
        std::vector<int> ans; //储存答案
        for (int i = 1; i <= n; i++) {
            if(!in[i]) q.push(i); //如果入度为0则加入队列中
        }
        
        while(!q.empty()) { //简单的搜索
            int t = q.front(); q.pop();
            ans.push_back(t);
            for (int i = head[t]; ~i; i = to[i]) {
                int v = ver[i];
                if(!in[v]) q.push(v);
            }
        }
        
        for (int i = 0; i < n; i++) { //查看拓扑排序后的数组
            printf("%d
    ", ans[i]);
        } return ;
    }
    
  • 相关阅读:
    如何在数据库某一列数据的前面或者后面增加字符
    jmeter分布式测试教程和远程的代理机无法连接网络的问题解决方法
    jmeter和jdk的安装教程
    第十周总结
    第九周总结
    第八周总结
    企业应用架构模式-阅读笔记01
    需求征集系统进度08
    需求征集系统进度07
    第七周总结
  • 原文地址:https://www.cnblogs.com/Nicoppa/p/11549836.html
Copyright © 2020-2023  润新知