在正式编写最小生成树的算法之前,还需要做一些准备工作。具体的工作就是建立一些基础对象。
首先需要建立边的对象。现在的边要增加权重信息,一条边需要记录两个端点以及这条边的权重,因此边类的轮廓如下:
public class Edge implements Comparable<Edge> {
public Edge(int v, int w, double weight) {
}
// 返回任意一个端点
public int either() {
}
// 返回另外一个端点
public int other(int v) {
}
// 和另外一条边比较权重
@Override
public int compareTo(Edge that) {
}
// 返回这条边的权重
public double weight() {
}
@Override
String toString();
}接口知道以后,实现方面就非常方便了。
public class Edge implements Comparable<Edge> {
private int v;
private int w;
private double weight;
public Edge(int v, int w, double weight) {
this.v = v;
this.w = w;
this.weight = weight;
}
// 返回任意一个端点
public int either() {
return v;
}
// 返回另外一个端点
public int other(int v) {
if (v == this.v) return w;
else return this.v;
}
// 和另外一条边比较权重
@Override
public int compareTo(Edge that) {
if (this.weight < that.weight) return -1;
if (this.weight > that.weight) return 1;
return 0;
}
// 返回这条边的权重
public double weight() {
return this.weight;
}
@Override
public String toString() {
return String.format("%s-%s %s", v, w, weight);
}
}
下面为权重图建立一个类。它的接口是这样的:
public class EdgeWeightedGraph {
public EdgeWeightedGraph(int V) {
}
// 在图中增加一条边
public void addEdge(Edge e) {
}
// 获取与指定顶点相邻的边
public Iterable<Edge> adj(int v) {
}
// 获取图中所有的边
public Iterable<Edge> edges() {
}
// 获取该图中的顶点数量
public int V() {
}
// 获取该图中的边数
public int E() {
}
// 将图转换成字符串用于显示
@Override
public String toString() {
}
}这样设计接口的好处就是能够让图支持自连接以及并行连接。权重图的全部代码如下:
import java.util.LinkedList;
import java.util.List;
public class EdgeWeightedGraph {
private int V;
private List<Edge>[] adj;
private List<Edge> allEdges;
public EdgeWeightedGraph(int V) {
this.V = V;
allEdges = new LinkedList<Edge>();
adj = new LinkedList[V];
for (int i = 0; i < V; i++) {
adj[i] = new LinkedList<Edge>();
}
}
// 在图中增加一条边
public void addEdge(Edge e) {
int v = e.either();
int w = e.other(v);
adj[v].add(e);
adj[w].add(e);
allEdges.add(e);
}
// 获取与指定顶点相邻的边
public Iterable<Edge> adj(int v) {
return adj[v];
}
// 获取图中所有的边
public Iterable<Edge> edges() {
return allEdges;
}
// 获取该图中的顶点数量
public int V() {
}
// 获取该图中的边数
public int E() {
return allEdges.size();
}
// 将图转换成字符串用于显示
@Override
public String toString() {
String result = "";
for(Edge e : edges()) {
result += e.toString();
result += "\n";
}
return result;
}
}
最小生成树应该从一个权重图创建,而且它的边是权重图的子集,因此MST的接口应该是这样的:
public class MST {
public MST(EdgeWeightedGraph G) {
}
// 返回最小生成树中所有的边
public Iterable<Edge> edges() {
}
// 返回最小生成树中所有边的权重之和
public double weight() {
}
}原文地址:http://blog.csdn.net/caipeichao2/article/details/32728527