2025CSP-J 冲刺训练(5):拓扑排序 Ⅱ

一、基础知识

1. AOV 网

AOV 网:以顶点表示活动,以有向边表示活动之间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Network),简称 AOV 网。

2. 拓扑序列

G = ( V , E ) G=(V,E) G=(V,E) 是一个具有 n n n 个顶点的有向图, V V V 中的顶点序列 v 1 , v 2 , ⋯   , v n v_1,v_2,\cdots,v_n v1,v2,,vn,满足若从顶点 v i v_i vi v j v_j vj 有一条路径,则在顶点序列中顶点 v i v_i vi 必在顶点 v j v_j vj 之前。

3. 拓扑排序

构造拓扑序列的过程,每个图的拓扑排序不一定唯一。

4. 拓扑排序方法

  1. 从 AOV 网中选择一个没有前驱(入度为 0 0 0 的点,无依赖)的顶点,并输出;
  2. 从 AOV 网中去掉该顶点以及以该顶点为出发点的所有边;
  3. 重复上述过程,直到 AOV 网中的不存在入度为 0 0 0 的顶点。

5. 判断有无回路

完成 3 3 3 后,如果 AOV 网中还有顶点,说明有回路;反之,说明所有顶点都被输出,即没有回路。

6. DAG 图

有向无环图(DAG,Directed Acycline Graph)是树的泛化,和树具有类似的层次性。
因为 DAG 图由于具有层次性,因此具有无后效性。一些实际问题中的二元关系都可使
用 DAG 来建模,从而将这些问题转化为 DAG 上的最长(短)路问题。

拓扑排序是一个可以把所有的顶点排序的算法,它排序的依据是深度优先搜索算法的完成时间。可以根据拓扑排序来计算有向无环图(的单源最短路径),因为拓扑排序正好是建立在无环的基础上,在这个图中没有负权重边以及回路边。

拓扑排序是将图中所有顶点排成一个线性序列,使得图中任意一对顶点 u , v u,v u,v,若边 ( u , v ) ∈ E ( G ) (u,v)\in E(G) (u,v)E(G),则 u u u 在线性序列中出现在 v v v 之前。通常,这样的线性序列称为满足拓扑次序的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

对于一个 DAG,可以这样确定一个图中顶点的顺序:对于所有的 u , v u,v u,v,若存
在有向路径 u->v,则在最后的顶点排序中 u u u 就位于 v v v 之前。这样确定的顺序
就是一个 DAG 的拓扑排序。
拓扑排序的特点如下:
1)所有可以到达顶点 v v v 的顶点 u u u 都位于顶点 v v v 之前;
2)所有从顶点 v v v 可以到达的顶点 u u u 都位于顶点 v v v 之后另外,只有有向无环图才存在拓扑排序,一个图的拓扑顺序不唯一。

7. 拓扑排序模板

bool topoSort(){
   
   
    queue<int>que;//存储所有入度为 0 的点
    for(int i=1;i<=n;i++)
        if(inDeg[i]==0)
            que.push(i);
    int cnt=0;//删除过的点的个数
    while(!que.empty()){
   
   
        int u=que.front();
        que.pop();//删除目前入度为 0 的点
        cnt++;
        //将以 u 为出发点的所有点删除
        for(int v:edges[u]){
   
   
            inDeg[v]--;
            if(inDeg[v]==0)
                que.push(v);
        }
    }
    return cnt==n;
}

二、基础应用

1. 最大食物链计数

1.1 审题

题目描述

你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条。于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧。
给你一个食物网,你要求出这个食物网中最大食物链的数量。(这里的"最大食物链",指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者。)
Delia 非常急,所以你只有 1 1 1 秒的时间。由于这个结果可能过大,你只需要输出总数模上 80112002 80112002 80112002 的结果。

输入格式

第一行,两个正整数 n , m n,m n,m,表示生物种类 n n n 和吃与被吃的关系数 m m m
接下来 m m m 行,每行两个正整数,表示被吃的生物A和吃A的生物B。

输出格式

一行一个整数,为最大食物链数量模上 80112002 80112002 80112002 的结果。

1.2 分析

按照样例举例:

5 7
1 2
1 3
2 3
3 5
2 5
4 5
3 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值