最小生成树
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边,对于加权图,边的权值之和还应最小。
连接n个顶点只需要n-1条边。
Prim算法
算法描述
- 输入:一个加权连通图,其中顶点集合为V,边集合为E;
- 初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
- 重复下列操作,直到Vnew=V:
(1)在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
(2)将v加入集合Vnew中,将<u, v>边加入集合Enew中; - 输出:使用集合Vnew和Enew来描述所得到的最小生成树。
代码
import java.util.Arrays;
/**
* 最小生成树算法--Prim算法
* Prim算法:可在加权连通图里搜索最小生成树
* 图的最小生成树:不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。
* @author dxt
*
*/
public class Prim {
public static void main(String[] args) {
char[] vertexs = new char[]{
'A', 'B', 'C', 'D', 'E', 'F', 'G'};
int vertexNum = vertexs.length;
//边权矩阵,其中0表示对应顶点不连通
int[][] weight = {
{
0, 5, 7, 0, 0, 0, 2},
{
5, 0, 0, 9, 0, 0, 3},
{
7, 0, 0, 0, 8, 0, 0},