数据结构与算法(12):最小生成树

原理

树的两条基本性质:

  • 用一条边连接树中的任意两个顶点都会产生一个新的环。
  • 从树中删去一条边将会得到两课独立的树。

切分定理

在一幅加权图中,给定任意的切分,它的横切边中的权重最小者必然属于树的最小生成树。

最小生成树的贪心算法

将含有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].
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值