• 拓扑排序


    什么是拓扑排序呢?他又是用来干嘛的?

    生活中,我们经常面临这样的情况:几件事情之间有相互依赖关系,必须其中的几件发生,某件才能发生。我们可以用有向无环图来表示这种关系,一个点指向另一个点代表该点要先于另一点。注意一定是没有环的,否则就进入了无休止的死循环。。。

    这样,每个点的入度代表该点先前的点数,任意时刻入度为0的点就是可以访问的点。每次访问一点并将其从图中删除,对应的点入度减1,不断重复这个过程,知道所有的点都被遍历,这就叫拓扑排序。特别的,点的访问顺序叫做拓扑序,一个DAG可能有多个拓扑序。

     1 int ans[maxn],cnt;
     2 queue<int> q; //队列用于存放入度为0的点
     3 struct edge { //邻接表存储图
     4     int v,next;
     5 } E[maxm];
     6 void topo_sort() {
     7     for(int i=1;i<=n;++i) if(!ind[i]) q.push(i); //先将入度为0的点入队
     8     while(!q.empty()) {
     9         int u=q.front();q.pop();
    10         ans[++cnt]=u; //记录拓扑序,通过cnt是否等于n还可判断是否存在拓扑序
    11         for(int p=head[u];p+1;p=E[p].next) //删边,该点指向的点的入度减1,同时将新的入度为0的点入队
    12             if(!(--ind[E[p].v])) q.push(E[p].v);
    13     }
    14 }
  • 相关阅读:
    BZOJ 4710: [Jsoi2011]分特产
    P4859 已经没有什么好害怕的了
    BZOJ 2839 集合计数
    P1450 [HAOI2008]硬币购物
    P3440 [POI2006]SZK-Schools
    P4177 [CEOI2008]order
    对于最小割的进一步理解
    P2774 方格取数问题
    JAVA网络编程TCP通信
    JAVA多线程及补充
  • 原文地址:https://www.cnblogs.com/Mr94Kevin/p/9580334.html
Copyright © 2020-2023  润新知