数据结构基础学习之(图)

2019-04-05  本文已影响0人  JiaJianHuang

主要知识点

一、图的概念

图的定义:

基本概念

6.1无向图和有向图.png 6.2无向网和有向网.png 6.3子示意图.png 连通图.png 强连通分量.png

二、图的存储结构

1. 邻接矩阵(Adjacency Matrix):
有向图的邻接矩阵.png 无向图邻接矩阵.png

2. 邻接表(Adjacency List)

  1. 顶点的度:
    • 无向图中,顶点的度等于该顶点邻接表中边结点的个数, 如下图顶点v1的度为2
    • 有向图中,顶点的出度等于该顶点邻接表中边结点的个数;入度需要遍历整个邻接表或建立一个逆邻接表; 如下图的顶点v0, 由邻接表知出度为1,逆邻接表知入度为2
7-4-6无向图邻接表.png 7-4-7有向图的邻接表.png
  1. 邻接表 完整代码

3. 图的遍历

  1. 类型:
DFS遍历的序列:01374256 .gif

4. 最小生成树(Spanning Tree) 可视化

概念:

构造最小生成树的准则:

  1. 只能使用该图中的边构造最小生成树
  2. 当且仅当使用n-1条边连接图中的n个顶点
  3. 不能使用产生回路的边

克鲁斯卡尔算法(Kruskal)

  1. 步骤:
  1. 示意图


    6.15Kruskal's Algorithm.png
  2. Kruskal.java 邻接矩阵实现

普里姆算法(Prim)

  1. 步骤:
  1. 示意图


    6.16Prim's Algorithm.png
  2. Prim.java 邻接矩阵实现

5. 最短路径
  1. 最短路径: 两个顶点之间经过的边上权值之和最少的路径; 路径上第一个顶点称为源点,最后一个顶点称为终点
  2. 迪杰斯特拉(Dijkstra) 算法
  1. 弗洛依德(Floyd) 算法
  1. 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。
  2. 假设图G中顶点个数为N,则需要对矩阵S进行N次更新。
  3. 初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞。
  4. 接下来开始,对矩阵S进行N次更新。
  5. 第1次更新时,如果"a[i][j]的距离" > "a[i][0]+a[0][j]"(a[i][0]+a[0][j]表示"i与j之间经过第1个顶点的距离"),则更新a[i][j]为"a[i][0]+a[0][j]"。同理,第k次更新时,如果"a[i][j]的距离" > "a[i][k]+a[k][j]",则更新a[i][j]为"a[i][k]+a[k][j]"。更新N次之后,操作完成!
6. 拓扑排序
  1. 有向无环图: 无环的有向图称为有向无环图(Directed Acycline Grap,DAG)
  2. 顶点活动网: 顶点表示活动,弧表示活动之间的优先制约关系,称为这种有向图为顶点活动网(Activity On Vertex,AOV)
  3. 判读有向环:若AOV网 不能得到拓扑有序序列,则必定存在有向环
  1. 在AOV网中选择一个没有前驱的顶点输出
  2. 从AOV网中删除该顶点以及从它出发的弧
  3. 重复步骤1和2, 直到AOV网为空,,或者剩余子图中不存在没有前驱的顶点,后一种情况则说明该AOV网存在有向环。

7. 关键路径

术语

  1. AOE网:
    以顶点表示事件,弧代表活动,权表示活动需要的时间顶点表示以它为弧头的所有弧代表的活动已完成,所有以它为弧尾的弧代表的活动可以开始
  2. 源点和汇点:
    正常情况(无环)下,网中只有一个入度为零的点,称为源点
    一个出度为零的点,称为汇点。
  3. 关键路径:
    完成整个工程的最短时间是从源点到汇点的最长路径的长度(路径长度等于路径上各边的权之和)
    这条具有最大长度的路径称为关键路径
  4. ee(i):表示事件Vi的最早发生时间
  5. le(i):表示事件Vi的最迟发生时间;
  6. e(k):活动ak=<vi,vj>的最早开始时间
  7. l(k):活动ak=<vi,vj>的最迟开始时间;定义e(i)=l(i)的活动叫关键活动;
  8. l(k)-e(k):完成活动ak的时间余量

步骤

  1. 求ee(j): 从源点V1出发,令ee(V1)=0, 按照拓扑排序序列求其余各顶点的最早发生时间,ee(j) = max{ee(i)+ len<vi,vj>}; len<vi,vj>}是弧<vi,vj>上的权值;如:ee(V2) = ee(V1) + a1 = 0+6=6; ee(V5) = ee(v2) + a4 = 6+1=7
  2. 求le(i): 从汇点v_{n-1}出发,令le(n-1) = ee(n-1) ,按照逆拓扑排序序列求其余顶点的最晚开始时间le(i); le(i) =min{ le(j)-len<vi,vj>};len<vi,vj>}是弧<vi,vj>上的权值; 如:令le(V9)= ee(V9) = 18; le(V8) = le(V9) - a11 = 18-4 = 14;
  3. 求每一项活动ai 的最早开始时间 e(i) = ee(j) 和最晚开始时间 l(i) = le(j) - len<vi,vj>;
    若e(i) == l(i) ,则为关键活动。如上图: e(a1) = ee(V1) = 0, l(a1) = le(V1) - 0= 0; e(a2) = ee(V1) = 0 , l(a2) = le(V3) - a2 = 6-4=2

代码实现

上一篇 下一篇

猜你喜欢

热点阅读