图结构;有多个前驱和后继。
带权值的路径,在通讯网络中路由策略中会使用到最小生成树算法,即连接网络中的各个点的最小总路径,不止路由算法中,在我们生活中电线的铺设,利用最短的材料完成网络的建设等,都需要最小生成树算法。
图的表示
分类:无向图,有向图,带权图
存储方式:
图 我们需要保存两个信息,点信息和两点之间的距离信息。
1.邻接矩阵
2.邻接表(数组链表,multimap形式)
邻接表就是数组链表的形式,当然我们还可以通过哈希链表的形式来存储;有向图中,链表节点的只是出侧的节点信息。
邻接矩阵就是二维数组,无向图[i][j] 和[j][i]相等,矩阵只有上半部;有向图中[i][j]和[j][i]值保存的分别为以i为起点j为终点的向量和j为起点i为终点的向量。
邻接矩阵有一缺点,当点数很多,路经很短的话,将很浪费空间。
图的遍历
数组链表的遍历,没什么可深究。
最小生成树算法
最小生成树即连接所有点的最小的路径长度。
算法:
-
普里姆算法:
以一点为开始,只取与其他点最小的路劲。划分两个集合,再找两个集合之间的最短路径
图示:
实现过程:
两个数组保存两个集合,分别遍历两个集合,找出两个集合中距离最短的边,加入生成树(边的数组)。 -
克鲁斯卡尔算法:
贪心策略,取所有点中最小的路径,直至所有的点都连接到网络中。要点:判断路径的两点是否已选中连接。
图示:
实现细节:
存储方式:邻接矩阵。
边结构struct {
int start,
int end,
int weight; /权重/
}
将所有边按边的长度排序,只读取矩阵上三角的值,也就是作为有向图读入。
从小到大,如果这条边连接两个不同顶点。
如何判断连接两个不同的定点?
将加入生成树的边从头到尾连接成一个个向量,已在生成树中的点沿着向量方向找到终点,如果两个点所在向量的终点是同一个,那就说明是连接相同的定点。
细节:
使用一个数组保存所有点所在的向量信息。
下表为向量起点的值,存储值为向量的终点。 -1表示已它为起点的向量不存在。以一个数组下标开始,沿着向量方向可以串成一个长向量。
中国大学mooc 西安交通大学《算法设计与问题求解》