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 拓扑排序方法

  1. 从 AOV 网中选择一个没有前驱(入度为 0 0 0 的点,无依赖)的顶点,并输出;
  2. 从 AOV 网中去掉该顶点以及以该顶点为出发点的所有边;
  3. 重复上述过程,直到 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值