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

本文介绍了最小生成树的原理,包括切分定理,以及两种经典算法:Prim算法和Kruskal算法。Prim算法通过逐步添加连接树内外顶点的最小权重边来构建最小生成树,可以采用延时实现或即时实现。Kruskal算法则按边的权重排序,避免形成环,直到找到V-1条边。
摘要由CSDN通过智能技术生成

原理

树的两条基本性质:

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

切分定理

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

最小生成树的贪心算法

将含有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].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值