408数据结构------5.图

图的概念

  1. 定义:
    线性表可以是空表,树可以是空树,但图一定非空(边集可以为空)
  2. 简单图和多重图
    简单图:不存在重复的边,不存在到自己的边
    多重图:
    在这里插入图片描述

  3. 顶点的度=入度+出度
  4. 顶点与顶点的关系
名称概念
路径顶点和相邻顶点序偶构成的边形成的序列
回路/环408不要求区分,但其实是不一样的
简单路径路径序列中顶点不重复出现
简单回路除了第一个和最后一个顶点外,顶点不重复
路径长度边的个数
距离路径存在:距离=最短路径
连通无向图两节点之间有路径
强连通有向图两节点之间互相有路径
连通分量无向图的极大连通子图=连通分量
强连通分量有向图的极大连通子图=强连通分量
生成树包含全部顶点的极小连通子图
生成森林非连通图中,连通分量的生成树构成生成森林
生成子图包含全部顶点的子图
边的权值

连通图指的是无向图
强连通图指的是有向图

图的存储以及基本操作

图的存储

邻接矩阵

在这里插入图片描述

领接表

在这里插入图片描述

十字链表(有向图)

在这里插入图片描述

邻接多重表(无向图)

在这里插入图片描述

图的遍历

BFS(广度优先搜索)

  1. 思路:
    首先访问起始顶点v,然后选取与v邻接的全部顶点w1。。。wn,再一次访问w1。。。wn邻接的全部顶点,依次类推,一层一层向下遍历,直到所有节点被访问过为止(一层一层的访问,这一层访问谁是没关系的)
  2. 代码实现:(以邻接表为存储结构)
    在这里插入图片描述
    请添加图片描述

DFS(深度优先遍历算法)

  1. 思路
    首先访问起始节点,然后选一条路走到黑,走不下去以后,折返一个点,再从这个新点,一条路走到黑,如此反复,直到所有点都被访问
  2. 代码实现
    在这里插入图片描述

图的应用

最小生成树

Prim算法(普利姆算法)

思路 :由小到大,逐步蚕食,每次并入最小路径,形成新的小团体
适用于边稠密图

Kruskal算法(克鲁斯卡尔算法)

思路:在所有离散的边中选最小的边(但两头已经连通的就不选了呀),一直到所有节点都连通
适用于边稀疏图

最短路径问题

单源最短路径(某一顶点到其余各顶点的最短路径)

  1. BFS(无权图)
    此时的广度优先生成树是以搜索起点为根的高度最小的生成树
    缺点:只适合求无权图或者每边权值相等的图
  2. Dijkstra(带权图,无权图)迪杰特斯拉算法
    思路:
    1.初始情况下,每个点到V0都有直达路径亦或是中转路径
    2.第一波,谁短谁纳入V0,就同流合污,
    3.纳入以后,你得更新每个点到V0的距离,有的点发现自己路过第一波纳入的那个点到V0,比一开始直达到V0近多了,那就更新一手
    4.第二波,在上面更新的结果里找到这次哪个点到V0的距离最短,在纳入同流合污,
    5.然后再更新距离表,如此往复
    缺点: 不适合有负的权值图

各顶点间的最短路径

  1. Floyd(带权图,无权图)弗洛伊德算法
    思路:
    每次加入一个点,看能否经由这个点让路径变短,矩阵则更新
    逐个顶点试探。从所有可能的路径中选出一条长度最短的路径
    缺点:
    能解决有负权值的图,不能解决有"负权回路"的图

有向无环图(Directed Acyclic Graph DAG)描述表达式

在这里插入图片描述
在这里插入图片描述
步骤:
把操作数不重复地排成一排
标出所有运算符的生效顺序
按顺序分层加入运算符
逐层检查是否可以合并

拓扑排序

  1. AOV网(active on vertex network):用顶点表示活动的网
  2. 拓扑排序:
    思路:
    1.从AOV网中选择一个没有前驱(入度为0)的顶点输出
    2.从网中删除该顶点和所有以他为起点的有向边
    3.重复1,2的内容直到当前的 AOV网为空或当前的网中不存在无前驱的顶点为止

关键路径

  1. AOE网的基本概念
    只有在某顶点所代表的事件发生后,该顶点出发的各有向边所代表的活动才能开始
    只有在进入某顶点的各有向边所代表的活动都已经结束时,该顶点所代表的事件才能发生
    在AOE中只有一个入度为0的点,叫源点,一个出度为0的点,叫汇点
  2. 操作过程:
    1. 基本概念
      ve()事件发生的最早时间
      vl()事件发生的最迟时间
      e()活动发生的最早时间
      l()活动发生的最迟时间
      d()活动时间余量:l()- e()
      关键活动的时间余量为0
    2. 解题步骤:
      1. 按拓扑排序序列,依次求每个点的ve()事件最早发生的时间:
        源点的最早发生时间是0
        若某一事件有多条路径,则选择开销最大的一条作为ve()的值
        累加求最大的过程,此节点的之前节点也是要求最大开销的

      2. 按逆拓扑排序序列,依次求各个点的vl()事件最迟发生时间:
        汇点的vl和ve是相等的:这个也等于关键路径长度
        某一点的vl是取,后一个点的vl减去(所有可能)路径上开销 的 最小值

      3. 求所有活动的最早发生时间e():
        最早时间等于弧的起点的最早发生时间

      4. 求所有活动的最晚发生时间l():
        最晚时间等于弧的终点的最晚时间-弧的权值

      5. d()=l()-e()是活动的时间余量:
        d为0的活动是关键活动,有关键活动可得关键路径

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对任意给定的(顶点数不小于20,边数不少于30,的类型可以是有向、无向、有向网、无向网),能够输入的顶点和边(或弧)的信息,并存储到相应存储结构(邻接矩阵、邻接表、十字链表、邻接多重表,任选其中两种类型),对自己所创建的完成以下操作: 对无向求每个顶点的度,或对有向求每个顶点的入度和出度(5分) 完成插入顶点和边(或弧)的功能(5分) 完成删除顶点和边(或弧)的功能(5分) 两种存储结构的转换(5分),如果其中一种存储结构为十字链表或邻接多重表则增加5分。 输出的深度优先遍历序列或广度优先遍历序列(5分) 求的深度优先或广度优先的生成树(或生成森林)(存储结构为孩子-兄弟链表),并对生成树进行遍历(15分) 判断的连通性,输出连通分量的个数(5分) 判断中是否存在环,无向5分,有向10分 给出顶点u和v,判断u到v是否存在路径(5分) 10、求顶点u到v的一条简单路径(10分) 11、求顶点u到v的所有简单路径(15分) 12、求顶点u到v的最短路径(10分) 13、求顶点u到其余各顶点的最短路径(15分) 14、求任两个顶点之间的最短路径(15分) 15、求最小生成树(15分) 16、对于有一个源点和一个汇点的有向网,求关键路径(20分) 编程环境可以是C、VC++、JAVA,每位同学从上述题目中选择100分的题目,注意,必须选择第1-6题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值