算法——图之加权图

加权图这里指无向加权图。

加权图是一种为每条边关联一个权值或成本的图模型。也就是在无向图的基础上,每条边加上权值。

加权图有很多应用,例如航空图中,边表示航线,权值表示距离或是费用。还能表示电路图,边表示导线,权值表示导线长度或是成本等等。

在这些情形下,我们最感兴趣的当然是成本最小化,也就是最小生成树问题。


最小生成树

一副加权无向图的最小生成树(MST)是一棵权值之和最小的生成树。而生成树则是一棵含有所有顶点的无环连通子图。


最小生成树算法:

1.Prim算法 2.Kruskal算法


这两个算法的本质都是贪心算法,都是基于切分定理得到的。

切分定理

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

上面两个最小生成树算法都是贪心算法,在保证最小生成树的基础上,选择边的算法。

当然,作为一个算法的使用者,我们更关心的是算法实现本身,这里提到切分定理只是表明,这两个算法是有理论依据的,可以放心使用。


当然,在完成最小生成树算法之前,我们第一步首先是要确定数据结构。

我们使用什么样的方式来表示加权无向图呢?

在非加权无向图中,我们使用邻接表矩阵的方式来保存无向图。而对于加权无向图,我们也采用同样的方式。但是不同的是,加权无向图有着非加权无向图的别的特性,那就是我们还需要保存 边的权重的信息。所以我们定义一个Edge边类,其中有weight属性,用来保存权重信息。

增加一个小小的修改就成了这样:

public class Edge { // 图的边
	private int v; // 另外一个
	private double weight; // 边的权重
}

但是呢,邻接表矩阵用List<>[]数组表示,调用add方法会增加引用。所以我们不妨这样:

public class Edge { // 图的边
	private int v; // 其中一个节点
	private int w; // 另一个节点
	private double weight; // 边的权重
}
将两条边的顶点都保存下来,这样的话,虽然看上去好像增加了冗余的信息,因为邻接表矩阵的下标就是当前的顶点。

其实并非是这样的,例如v-w。那么就存在Edge对象e,那邻接表矩阵v可以指向e,w也可以指向e。这样,我们就可以少创建一半的类。减小了内存的开销。

如图所示:

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值