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

Posted nicoppa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了『拓扑排序』拓扑排序模板相关的知识,希望对你有一定的参考价值。

拓扑排序学习前提须知

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

算法内容

竞赛需要用到的点

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\n", ans[i]);
     return ;

以上是关于『拓扑排序』拓扑排序模板的主要内容,如果未能解决你的问题,请参考以下文章

拓扑排序(模板)

[模板]tarjan缩点+拓扑排序

拓扑排序

[拓扑排序] aw3696. 构造有向无环图(拓扑排序+memset使用坑点+aw周赛004_3)

拓扑排序 模板

拓扑排序--确定比赛名次(模板题)