小张学算法之基础算法:3.图结构和最小生成树

图结构;有多个前驱和后继。
带权值的路径,在通讯网络中路由策略中会使用到最小生成树算法,即连接网络中的各个点的最小总路径,不止路由算法中,在我们生活中电线的铺设,利用最短的材料完成网络的建设等,都需要最小生成树算法。

图的表示

分类:无向图,有向图,带权图
在这里插入图片描述

存储方式:

图 我们需要保存两个信息,点信息和两点之间的距离信息。
1.邻接矩阵
2.邻接表(数组链表,multimap形式)
在这里插入图片描述
邻接表就是数组链表的形式,当然我们还可以通过哈希链表的形式来存储;有向图中,链表节点的只是出侧的节点信息。
邻接矩阵就是二维数组,无向图[i][j] 和[j][i]相等,矩阵只有上半部;有向图中[i][j]和[j][i]值保存的分别为以i为起点j为终点的向量和j为起点i为终点的向量。
邻接矩阵有一缺点,当点数很多,路经很短的话,将很浪费空间。

图的遍历

数组链表的遍历,没什么可深究。

最小生成树算法

最小生成树即连接所有点的最小的路径长度。
算法:

  1. 普里姆算法:
    以一点为开始,只取与其他点最小的路劲。划分两个集合,再找两个集合之间的最短路径
    图示:
    在这里插入图片描述
    实现过程:
    两个数组保存两个集合,分别遍历两个集合,找出两个集合中距离最短的边,加入生成树(边的数组)。

  2. 克鲁斯卡尔算法:
    贪心策略,取所有点中最小的路径,直至所有的点都连接到网络中。要点:判断路径的两点是否已选中连接。
    图示:
    在这里插入图片描述
    实现细节:
    存储方式:邻接矩阵。
    边结构struct {
    int start,
    int end,
    int weight; /权重/
    }
    将所有边按边的长度排序,只读取矩阵上三角的值,也就是作为有向图读入。
    从小到大,如果这条边连接两个不同顶点
    如何判断连接两个不同的定点?
    将加入生成树的边从头到尾连接成一个个向量,已在生成树中的点沿着向量方向找到终点,如果两个点所在向量的终点是同一个,那就说明是连接相同的定点。
    细节:
    使用一个数组保存所有点所在的向量信息。
    下表为向量起点的值,存储值为向量的终点。 -1表示已它为起点的向量不存在。以一个数组下标开始,沿着向量方向可以串成一个长向量
    在这里插入图片描述
    在这里插入图片描述

中国大学mooc 西安交通大学《算法设计与问题求解》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值