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

倖福魔咒の 提交于 2019-11-30 03:13:42

拓扑排序学习前提须知

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

算法内容

竞赛需要用到的点

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 ;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!