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

拓扑排序学习前提须知

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

算法内容

竞赛需要用到的点

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 ;
}
原文地址:https://www.cnblogs.com/Nicoppa/p/11549836.html