普利姆算法
/**
* Prim Algorithm
* 最小生成树是指能连通所有顶点的最小树
*/
public void prim() {
// 最小代价权值的数组,为0表示已经获取了最小权值
int[] lowcost=new int[vertexSize];
// 放顶点权值的数组
int[] adjvex=new int[vertexSize];
// 存放lowcost数组中目前的最小权值
int min;
// 存放lowcost数组中目前最小权值的下标
int minId;
// 计算总权值
int sum=0;
// 初始化lowcost为第一个位置
for(int i=1; i<vertexSize; i++) {
lowcost[i]=matrix[0][i];
}
for(int i=1; i<vertexSize; i++) {
min=MAX;
minId=0;
// 找到最小值
for(int j=1; j<vertexSize; j++) {
// 得到lowcost中最小值
if(lowcost[j] != VERTEX_NONE && lowcost[j] < min) {
min=lowcost[j];
minId=j;
}
}
System.out.println("Vertex:"+adjvex[minId]+" Value:"+min);
// 计算权值总和
sum+=min;
// 将权值对应位置的权值设为0,表示已经访问并且确定了
lowcost[minId]=0;
for(int j=1; j<vertexSize; j++) {
// 对应位置相同的,而且权值比lowcost中小的,就进行替换
if(lowcost[j] != VERTEX_NONE && matrix[minId][j] < lowcost[j]) {
// 权值替换
lowcost[j]=matrix[minId][j];
// 顶点替换
adjvex[j]=minId;
}
}
}
System.out.println("Total value:"+sum);
}
克鲁斯卡尔算法
/**
* Kruskal Algorithm
*/
public void kruskal() {
// 邻接表的长度
int allDataSize = 0;
// 邻接表
Edge[] edge=new Edge[allDataSize];
// 以起点为下标,终点为内容值的数组
int[] parent=new int[allDataSize];
for(int i=0; i<allDataSize; i++) {
parent[i]=0;
}
int n,m,sum=0;
for(int i=0; i<allDataSize; i++) {
// 得到第i邻接表位置所连通的最后一个点(在parent数组中寻找)
n=find(parent, edge[i].begin);
// 得到第i邻接表位置连通的下一位置所连通的最后一个点(在parent数组中寻找)
m=find(parent, edge[i].end);
// 如果n==m则出现回环
if(n!=m) {
// 保存到parent数组中,表示该n位置连接到下一位置m
parent[n]=m;
System.out.println(edge[i].begin+","+edge[i].end);
sum+=edge[i].weight;
}
}
System.out.println("sum="+sum);
}
private int find(int[] parent,int f) {
// 小于或等于0,则表示还没有连通
while(parent[f]>0) {
f=parent[f];
}
return f;
}