原理
树的两条基本性质:
- 用一条边连接树中的任意两个顶点都会产生一个新的环。
- 从树中删去一条边将会得到两课独立的树。
切分定理
在一幅加权图中,给定任意的切分,它的横切边中的权重最小者必然属于树的最小生成树。
最小生成树的贪心算法
将含有V个顶点的任意加权连通图中属于最小生成树的边标记为黑色:初始状态下所有边均为灰色,找到一种切分,它产生的横切边均不为黑色。将它权重最小的横切边标记为黑色。反复,直到标记了V-1条黑色边为止。
加权无向图的数据类型
public class Edge implements Comparable<Edge>{
private int v, w;
private 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 v){
return this.v == v ? w : this.v;
}
@Override
public int compareTo(Edge o) {
return (int)Math.floor(weight - o.weight);// 注意浮点数的比较
}
}
public class EdgeWeightGraph {
private int V;
private int E;
private Bag<Edge>[] adj;
EdgeWeightGraph(int V){
adj = new Bag[V];
for(int i = 0; i < V; i++){
adj[i] = new Bag<Edge>();
}
}
public int V(){
return V;
}
public int E(){
return E;
}
public void addEdge(int v, int w, double weight){
adj[v].