图论算法之最小生成树
最小生成树
定义
一幅加权图的最小生成树(MST)是它的一棵权值(树中所有边的权值之和)最小的生成树。
原理
图的一种切分是将图中所有顶点分为两个非空且不重叠的两个集合。横切边是一条连接两个属于不同集合的顶点的边。(下图中的红边即为横切边)
(切分定理):在一幅加权图中,给定任意的切分,它的横切边中的权重最小者必然属于图中的最小生成树。
由此可知我们只需要使用切分定理找到最小生成树的一条边,不断重复直到找到最小生成树的所有边。
数据类型基本实现
带权重的边的数据类型
package chapter4;
/**
* 带权重的边的数据类型
*/
public class Edge implements Comparable<Edge> {
private final int v;//顶点之一
private final int w;//另外一个顶点
private final double weight;//边的权重
Edge(int v, int w, double weight){
this.v=v;
this.w=w;
this.weight=weight;
}
public double weight(){
return weight;
}
/** 查询边的一个顶点 **/
public int either(){
return v;
}
/** 查询边的另外一个顶点 **/
public int other(int vertex) {
if (vertex == v) {
return w;
} else if (vertex == w) {
return v;
} else {
throw new RuntimeException("Inconsistent edge");
}
}
@Override
public int compareTo(Edge that)