先介绍一下最小生成树(Minimum Cost Spanning Tree),简称MST。
2.1普里姆算法
/**
* prim算法:最小生成树的构建过程
* @param graph
* @param v 假定从顶点V开始
*/
public void prim(int v){
//visited[]标记结点(顶点是否访问过)
boolean isVisited[]=new boolean[this.verxs];
//将当前顶点标记为已经访问
isVisited[v]=true;
//MST的边为(顶点个数-1)
for(int k=1;k
2.2克鲁斯卡尔算法
/**
* 克鲁斯卡尔算法:最小生成树的构建过程
*/
public void kruskal(){
int edgeNum=0; //边的数量
Setverxset=new HashSet<>(); //点的集合
//最小生成树边的个数是(顶点个数-1),以此作为循环条件
while(edgeNum!=this.verxs-1){
int min=Integer.MAX_VALUE;
//找到图中最小的边
int v1=-1;
int v2=-1;
for(int i=0;i
普里姆算法
package primAlgorithm;
import java.util.Arrays;
/**
* Prim算法
* @author BayMax
*
*/
public class PrimAlgorithm {
public static void main(String[] args) {
//手动创建图
char []data={'A','B','C','D','E','F','G'};
int verxs=data.length;
int [][]weight=new int[][]{
{10000,5,7,10000,10000,10000,2},
{5,10000,10000,9,10000,10000,3},
{7,10000,10000,10000,8,10000,10000},
{10000,9,10000,10000,10000,4,10000},
{10000,10000,8,10000,10000,5,4},
{10000,10000,10000,4,5,10000,6},
{2,3,10000,10000,4,6,10000},
};
MGraph graph=new MGraph(verxs);
//初始化点
graph.initGraph(verxs, data, weight);
//测试Prime算法
//graph.prim(0);
MGraph mst=graph.prim_pro(0);
mst.showGraph();
}
}
//图
class MGraph{
int verxs; //表示图的结点个数
char[] data; //存放结点的个数
int [][]weight; //存放边,邻接矩阵
//图的构造
public MGraph(int verxs) {
super();
this.verxs = verxs;
this.data = new char[verxs];
this.weight = new int[verxs][verxs];
}
/**
* 初始化图,创建图的邻接矩阵
* @param graph
* @param verxs
* @param data
* @param weight
*/
public void initGraph(int verxs,char []data,int[][]weight){
for(int i=0;i
克鲁斯卡尔算法
package kruskalAlgorithm;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* 克鲁斯卡尔算法
* @author BayMax
*
*/
public class KruskalAlgorithm {
public static void main(String[] args) {
//手动创建图
char []data={'A','B','C','D','E','F','G'};
int verxs=data.length;
int [][]weight=new int[][]{
{10000,5,7,10000,10000,10000,2},
{5,10000,10000,9,10000,10000,3},
{7,10000,10000,10000,8,10000,10000},
{10000,9,10000,10000,10000,4,10000},
{10000,10000,8,10000,10000,5,4},
{10000,10000,10000,4,5,10000,6},
{2,3,10000,10000,4,6,10000},
};
MGraph graph=new MGraph(verxs);
//初始化点
graph.initGraph(verxs, data, weight);
MGraph mst=graph.kruskal_pro();
mst.showGraph();
}
}
//图
class MGraph{
int verxs; //表示图的结点个数
char[] data; //存放结点的个数
int [][]weight; //存放边,邻接矩阵
//图的构造
public MGraph(int verxs) {
super();
this.verxs = verxs;
this.data = new char[verxs];
this.weight = new int[verxs][verxs];
}
/**
* 初始化图,创建图的邻接矩阵
* @param graph
* @param verxs
* @param data
* @param weight
*/
public void initGraph(int verxs,char []data,int[][]weight){
for(int i=0;iverxset=new HashSet<>(); //点的集合
//最小生成树边的个数是(顶点个数-1),以此作为循环条件
while(edgeNum!=this.verxs-1){
int min=Integer.MAX_VALUE;
//找到图中最小的边
int v1=-1;
int v2=-1;
for(int i=0;iverxset=new HashSet<>(); //点的集合
//最小生成树边的个数是(顶点个数-1),以此作为循环条件
while(edgeNum!=this.verxs-1){
int min=Integer.MAX_VALUE;
//找到图中最小的边
int v1=-1;
int v2=-1;
for(int i=0;i