java前序遍历 最小生成树_图的遍历之最小生成树(Java实现)

最小生成树是图理论中的一种最常见的应用,他是用最小的边连接所有的顶点。他们之间用最少量的边保证了他们彼此联通,这就组成了最下生成树。对于给定的顶点和边,可能有多种最小生成树,最小生成树边E的数量总比顶点V的数量小1,记住这个关系:E=V-1,这里不用关心边的长度,因为我们不是要找最短路径,而是要找最少数量的边。

创建最下生成树的算法与搜索算法类似,可以使用深度优先搜索也可以使用广度优先搜索来实现,在搜索过程中,记录所走过的边,就可以创建一颗最小生成树。

这里以下图为例,图中顶点和边之间因为多条边的缘故,连通性虽好,但是过于复杂,其实可以有更少的边组成更简洁的图。

9d7a154884c4c2e30e85c4cd71c3be43.png

这里,如果只有如下的边,AB BC CD DE,也能让图联通起来,这就是这个图的一种最小生成树。如下图所示:

79419f011ee94a4be15b5d624367e67b.png

这时候边就是四条,顶点五个,正好满足E=V-1。下面给出最下生成树的实现代码:

Vertex.java

package com.xxx.algorithm.wh.mstgrapch;

public class Vertex {

public char label;

public boolean visited;

public Vertex(char label){

this.label = label;

this.visited = false;

}

}

StackX.java

package com.xxx.algorithm.wh.mstgrapch;

public class StackX {

private final int SIZE=20;

private int[] st;

private int top;

public StackX(){

st = new int[SIZE];

top = -1;

}

public void push(int i){

st[++top] = i;

}

public int pop(){

return st[top--];

}

public int peek(){

return st[top];

}

public boolean isEmpty(){

return top == -1;

}

}

Graph.java

package com.xxx.algorithm.wh.mstgrapch;

public class Graph {

private final int MAX_VERTS=20;

private Vertex[] vertLists;

private int[][] adjMat;

private int nVerts;

private StackX stack;

public Graph(){

vertLists = new Vertex[MAX_VERTS];

adjMat = new int[MAX_VERTS][MAX_VERTS];

nVerts = 0;

for(int i=0;i

运行程序,打印信息如下:

mst:AB BC CD DE

最小生成树的算法与深度优先搜索的方法大部分重叠,其中最主要区别的就是遍历的时候,打印的是边的信息,而不是顶点信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值