2025CSP-J 冲刺训练 4
一、基础知识
1. 数据结构
1.1 图
图(graph
)是一种点和点之间多对多关系所组成的数据结构。图也是由顶点的非空集合 V V V 和边的集合 E E E 组成的,表示为 G = ( V , E ) G = ( V , E ) G=(V,E)。一般地,我们用 V ( G ) V ( G ) V(G) 表示图 G G G 的顶点集,用 E ( G ) E ( G ) E(G) 表示图 G G G 的边集。
1.2 vector
直接翻译为向量,一般说为动态数组或变长数组,在删除数据和新增数据时会自动拓宽数组长度,整个过程无需人工干预,也不需要实现固定长度。动态数组一般用来 存储图 的邻接矩阵(adj[]
)。
方法 | 功能 |
---|---|
.push_back(x) |
尾部增添 |
.pop_back() |
尾部删除 |
.size() |
元素个数 |
.clear() |
清空 |
1.3 邻接链表
假如有一个图,描述如下:
V ( G ) = 1 , 2 , 3 , 4 , 5 E ( G ) = ( 1 , 2 ) , ( 2 , 3 ) , ( 3 , 4 ) , ( 3 , 5 ) V(G)=1,2,3,4,5\\ E(G)=(1,2),(2,3),(3,4),(3,5) V(G)=1,2,3,4,5E(G)=(1,2),(2,3),(3,4),(3,5)
则有这样的一个邻接链表,存储每个点可到达的点:
起点 | 0 | 1 | 2 |
---|---|---|---|
1 | 2 | ||
2 | 3 | ||
3 | 2 | 4 | 5 |
4 | 3 | ||
5 | 3 |
因此在邻接链表定义的时候,通常会使用代码 vector<int>edges[N]
定义一个变长数组数组。
1.4 队列
先进先出的一种容器,可以用来存储拓扑排序的结果。
方法 | 功能 |
---|---|
.push(x) |
队尾插入 |
.pop() |
队头弹出 |
.front() |
返回队头 |
.back() |
返回队尾 |
.empty() |
判空 |
.size() |
大小 |
1.5 优秀队列
元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除,拥有最高级先出的特点。
数字越大优先级越高:
priority_queue<int>q;
数字越小优先级越高:
priority_queue<int,vector<int>,greater<int> >q;
2. 拓扑排序
2.1 AOV 网
AOV 网:以顶点表示活动,以有向边表示活动之间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Network),简称 AOV 网。
2.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 之前。
2.3 拓扑排序
构造拓扑序列的过程,每个图的拓扑排序不一定唯一。
2.4 拓扑排序方法
- 从 AOV 网中选择一个没有前驱(入度为 0 0 0 的点,无依赖)的顶点,并输出;
- 从 AOV 网中去掉该顶点以及以该顶点为出发点的所有边;
- 重复上述过程,直到 AOV 网中的不存在入度为 0 0 0 的顶点。
2.5 判断有无回路
完成 3 3 3 后,如果 AOV 网中还有顶点,说明有回路;反之,说明所有顶点都被输出,即没有回路。
2.6 模板
bool topoSort(){
queue<int>que;//存储所有入度为 0 的点
for(int i=1;i<=n;i++)
if(inDeg[i]==0){
que