克鲁斯卡尔(Kruskal)算法

1.应用场景-公交站问题

1662115489417

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个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止

克鲁斯卡尔算法重点需要解决的以下两个问题:

  1. 对图中所有边按照权值大小进行排序
  2. 将边添加到最小生成树中时,怎样判断是否形成了回路。

上述两个问题的解决办法

  1. 采用排序算法进行排序即可;
  2. 记录顶点在“最小生成树"中的终点,顶点的终点是“在最小生成树中与它联通的最大顶点”。然后每次需要将一条边添加到最小生成树时,判断该边的两个顶点的终点是否重合,重合的话则会构成回路。加入的边的两个顶点不能都指向同一个终点,否则将构成回路。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值