声明:
V:顶点 E:边
有向完全图:
连通图:
简单路径:在路径序列中,顶点不重复出现的路径称为 简单路径
文章目录
有向图:
度= 入度+出度
入度和=出度和
强连通是指有向图【A->B B->A】
保证 强连通至少n条边
子图
强连通分量:就是在原有的图上面进行分离,分离尽可能多的边和顶点
有向完全图::任意两个顶点之间都存在两条相反的弧 n个顶点 2C²n条边
邻接矩阵法:出度:看行 入度:看列
无向图 n个定点
度=:[E]2 边2
连通图指无向图,如果要
保证为 **连通图 ** 至少要n-1条边
非连通图 最多有 C²n-1条边
子图
连通分量:就是在原有的图上面进行分离,分离尽可能多的边和顶点
生成树:包含图中 ** 全部顶点 **的一个极小连通子图(也就是边要尽可能的少) n-1条边
无向完全图:任意两个顶点之间都存在边 n个定点 边为C²n
** 除邻接矩阵表示(排序)方式唯一,其他的都不唯一 **
邻接矩阵法 O(|V|²)
适合边多的图,不适合稀疏图 o(n²)
邻接表发(顺序+链式存储)
邻接表表示 能够直接接连的节点。
如:1–2 1–5
十字链表法(只限于有向图)
找某节点 出边 顺着绿色
找某节点 入边 顺着橙色色
邻接多重表(无向图)
跟上图十字链表很相似,当删除B节点时候,会直接将节点删除,这样关联b的线路都会断掉。
而十字链表法是 当删除B的时候,根据B的线路进行删除线,而不是节点
广度优先遍历 BFS
广度优先遍历: 见名知意,广泛的扩展节点的走向
如果邻接矩阵的方式的话:那么久应该按照 节点的大小进行
如果不是那么排序的方式可以为多种
广度优先生成树
广度优先生成森林
深度优先遍历DFS
DFS:见名知意,深度的去挖掘所连接的节点,如果不能走下去,那么返回上一个节点,然后再去深挖相连线的节点。
邻接矩阵
2开始2 1 5 6 3 4 7 8
3:3 4 7 6 2 1 5 8
4:4 3 6 2 1 5 7 8
1:1 2 6 3 4 7 8 5
邻接表(复杂点) 不唯一
2:2 6 7 8 4 3 1 5
3:3 6 2 1 5 7 8 4
1:1 2 6 7 8 4 3 5
最小生成树
最小生成树的代价,各路线是不进行累加的,只计算单点的路线;
如:p城–>矿场–>渔村,渔村的代价在数组中还是是为:2
Prim 算法(普⾥姆) 稠密图
每次都找已有节点的 最小代价线路 进行。
例: P城–>学校 P城–>矿场 矿场–>渔村 P城–>农场 农场–>电站
Kruskal 算法(克鲁斯卡尔) 稀疏图
每次都选择代价最少的一条边进行连接。
例: 农场–>电站 P城–>学校 矿场–>渔村 P城–>矿场 农场–>P城
最短路径(代价路线的进行累加的)
代价路线是进行累加的:如V0->V1->V2,那么V2在数组中的代价就是为 11
Dijkstra(迪杰斯特拉)算法
特点:不适合带有 负权值的 路线
如果不看代码:只让手动找到路线。 那么就直接看哪个路线
就是查看V0-V2 哪个 条线路的代价最低。
Floyd算法–p228(王道书)
运算原理:根据矩阵来看,每次根据已经知道的节点权值进行相加,然后选出最小的值。
如果不看代码:只让手动找到路线。 那么就直接看哪个路线
A(-1):表示各顶点之间的最短路径
path(-1):表示两个顶点的中转点
有向无环图
初步一:
第二步:将相同的合并
例题:(x+y)((x+y)/5) 顶点个数最少为? --5
拓扑排序(AOV)
如果图有换是肯定不纯在拓扑排序的
从正常的入度为0的点开始,需要一步一步走,不能删除还有线连接的节点
正常的拓扑排序
准备厨具->买菜->洗番茄->打鸡蛋->切番茄->下锅炒->吃
逆拓扑排序
从出度为0的顶点开始
吃->下锅炒->切番茄->洗番茄->打鸡蛋-买菜-准备厨具 (不唯一)
关键路径(重要)
AOE网,顶点 | 表示事件(路径)、有向边 | 表示活动
最大长度的路径并且不可替换,由顶点进行组成的称为:关键路径
而关键路径上面的活动称为:关键活动
最迟开始时间-最早开始时间 = 时间余量
时间余量为0的活动点,为关键活动, 找到关键活动就可以找到关键路径
最早发生时间:需要依赖 正拓扑排序 max
最迟发生时间:需要依赖逆拓扑排序
最迟发生时间:权值看的是 直接连接路径 min
计算顺序(重要)
先路径(节点)最早/晚,然后活动(线路)最早/晚
1、 根据拓扑排序先进行算出 (路径)节点的最早\最迟发生时间 (也可以不按照拓扑排序)
2、 然后再根据节点 活动的前一个节点(正向\逆向)算出活动的最早\最迟发生时间
3、 再由最早\最迟 活动算出余量,最后得出 关键路径/关键活动
例:
(拓扑不唯一)
正拓扑:V1–V3–V2–V4–V5–V6
逆拓扑:V6–V5–V4–V2–V3–V1
路径最早: 正这来算 要最大值MAX
V1 | V3 | V2 | V4 | V5 | V6 |
---|---|---|---|---|---|
0 | 2 | 3 | 6 | 6 | 8 |
路径最迟min:反这来算 看直接路径 要最小值MIN
V6 | V5 | V4 | V2 | V3 | V1 |
---|---|---|---|---|---|
8 | 7 | 6 | 4 | 2 | 0 |
活动最早:
a1 | a2 | a3 | a4 | a5 | a6 | a7 | a8 |
---|---|---|---|---|---|---|---|
V1=0 | V1=0 | V2=3 | 3 | 2 | 2 | 6 | 6 |
活动最迟:
a1 | a2 | a3 | a4 | a5 | a6 | a7 | a8 |
---|---|---|---|---|---|---|---|
1 | 0 | 4 | 4 | 2 | V6-a6=5 | V6-a7=6 | V6-a8=7 |
余量: 最迟-最早(活动)
a1 | a2 | a3 | a4 | a5 | a6 | a7 | a8 |
---|---|---|---|---|---|---|---|
1 | 0 | 1 | 1 | 0 | 3 | 0 | 1 |
即关键路径为: (余量为0点,顶点组合)
V1–V3–V4–V6
关键活动:(余量为0点的活动)
a2、a5、a7
注意事项
· 关键活动耗时增加\减少、整体工程增加\减少
· 当关键活动缩短到一定程度可能会变成 非关键活动
注意:(重)
1、关键路径是可能会有多条
2、如果有多条关键路径,想要 缩短工程的进度,那么缩短的路径,必须是 几条关键路径都包含的节点。
无向图的邻接矩阵是对称阵
关键路径求解:
只需求求出节点的:(重要)
最早和最晚即可,进行对比哪个为相同的。
练习题
关键路径求解:
解答: