一、避圈法解决的问题
上图是一个带有回路的简单带权图。即两点间可能不只有一种到达方式,且每条边都带有权值。
在实际生产环境中,可将此图看作是城市间线缆的建造成本,或者拼车时送达各乘客的路线成本。
而避圈法是为了在这种图的基础上,得到一条连接所有点,且总权值最小的图。
在《图论》中称作该图权重最小的最小生成树,如下图:
二、代码展示
测试类:
package mintree;
import java.util.List;
/**
* @author sean22
* @date 2018/1/30/030.
*/
public class Test {
public static void main(String[] args) {
int X = Kruskal.X;
int[][] matrix = {
{X,X,X,3,4,X},
{X,X,2,X,5,X},
{X,2,X,X,X,4},
{3,X,X,X,X,2},
{4,5,X,X,X,3},
{X,X,4,2,3,X}
};
List<Line> lines = Kruskal.getASCLines(matrix);
Kruskal.loadPath(lines,matrix);
Kruskal.print(matrix);
}
}
主要功能类:
package mintree;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* @author sean22
* @date 2017/12/13/013.
* 避圈法
*/
public class Kruskal {
static int X = Integer.MAX_VALUE;
public static List<Line> getASCLines(int[][] matrix){
List<Line> lines = new LinkedList<>();
for(int i=0;i<matrix.length;i++){
for(int j=i;j<matrix[i].length;j++){
if(matrix[i][j]!=X){
Line line = new Line(i,j,matrix[i][j]);