1.应用场景-公交站问题
1)某城市新增7个站点(A, B, C, D, E, F, G) ,现在需要修路把7个站点连通
2)各个站点的距离用边线表示(权) ,比如 A – B 距离 12公里
3)问:如何修路保证各个站点都能连通,并且总的修建公路总里程最短?
2.克鲁斯卡尔算法介绍
1)克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。
2)基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路
3)具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止
克鲁斯卡尔算法重点需要解决的以下两个问题:
- 对图中所有边按照权值大小进行排序
- 将边添加到最小生成树中时,怎样判断是否形成了回路。
上述两个问题的解决办法
- 采用排序算法进行排序即可;
- 记录顶点在“最小生成树"中的终点,顶点的终点是“在最小生成树中与它联通的最大顶点”。然后每次需要将一条边添加到最小生成树时,判断该边的两个顶点的终点是否重合,重合的话则会构成回路。加入的边的两个顶点不能都指向同一个终点,否则将构成回路。
3.克鲁斯卡尔代码实现
package com.yt.kruskal;
import java.util.Arrays;
public class KruskalCase {
private int edgeNum;// 边的个数
private char[] vertexs;// 顶点数组,记录顶点数据
private int[][] matrix;// 邻接矩阵,记录图的信息
// 使用INF表示两个顶点不能联通
private static final int INF = Integer.MAX_VALUE;
pub