贪心算法(四)——最小代价生成树

本文介绍了最小代价生成树问题,通过村庄通信线路的例子引出问题背景,阐述了Prim和Kruskal算法的原理和步骤。Prim算法采用贪心策略,每次选择连接生成树内外节点的最短边,而Kruskal算法则是按边的权值升序排序,避免形成环路。两种算法都用于解决如何在无向连通图中找到权值总和最小的生成树。
摘要由CSDN通过智能技术生成

这里写图片描述

问题描述

n个村庄间架设通信线路,每个村庄间的距离不同,如何架设最节省开销?

这个问题中,村庄可以抽象成节点,村庄之间的距离抽象成带权值的边,要求最节约的架设方案其实就是求如何使用最少的边、最小的权值和将图中所有的节点连接起来。
这就是一个最小代价生成树的问题,可以用Prim算法或kruskal算法解决。

  • PS1:无向连通图的生成树是一个极小连通子图。
  • PS2:生成树是图的一个子图,包括所有的顶点和最少的边(n-1条边)。
  • PS3:最小代价生成树就是所有生成树中权值之和最小的那个。

算法思路

算法的目标很明确,就是要在n个节点的图中,找出n-1个节点,并且节点之间连线的权值是最小的。因此总体思路如下:

/**
 * @param a:图的邻接矩阵
 */
EdgeSet spanningTree(int[][] a){
    // 结果集(边的集合)
    EdgeSet solution = new EdgeSet();
    // 选出n-1条边
    int i = 0;
    while( i<n && 还有未检查的边 ){
        // 选出一条边
        Edge edge = Select(a);
        // 判断是否有回路
        if ( !hasLoop(edge) ) {
            solution.add( edge );
        }
    }
    return solution;
}

上述为最小代价生成树的总体思路,其中选边方式(贪心准则)的不同,就产生不同的最小代价生成树算法。

图的邻接表示法

边节点

title
一个边节点有一条边 和 一个终止节点组成。

/**
 * 边节点(由一条边和一个终止节点构成)
 */
class ENode{
    int id;// 终止节点的编号
    int weight;// 边的权重
}

图的邻接表示

图用一个Map< String,List>表示,其中String表示节点的编号,List中存储以该节点为起点的所有边节点。
title

Map<
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值