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. 拓扑排序方法
- 从 AOV 网中选择一个没有前驱(入度为 0 0 0 的点,无依赖)的顶点,并输出;
- 从 AOV 网中去掉该顶点以及以该顶点为出发点的所有边;
- 重复上述过程,直到 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