求解最小生成树(适用于边稠密的网络)
如最小生成树为:
vertex[]={0,1,2,3,4,5,6}
<1,5> 距离7
<5,4> 距离2
<4,3> 距离4
< 3,2> 距离3
<4,6> 距离8
<1,0> 距离12
##搜索是已访问过的结点为起点,找出最小的边
访问过的结点 :1 未访问过的结点:2,3,4,5,6 (从1搜索)
访问过的结点 :1,5 未访问过的结点:2,3,4,6 (从1,5搜索)
访问过的结点 :1,5,4 未访问过的结点:2,3,6 (从1,5搜索)
........
访问过的结点 :1,2,3,4,5,6 未访问过的结点:null
java实现
public class PrimDemo {
private static final int INF=Integer.MAX_VALUE;
public static void main(String[] args) {
char[] vertexs={'A','B','C','D','E','F','G'};
int matrix[][]={
{0,12,INF,INF,INF,16,14},
{12,0,10,INF,INF,7,INF},
{INF,10,0,3,5,6,INF},
{INF,INF,3,0,4,INF,INF},
{INF,INF,5,4,0,2,8},
{16,7,6,INF,2,0,9},
{14,INF,INF,INF,8,9,0}
} ;
Graph graph=new Graph(vertexs,matrix);
MinTree minTree=new MinTree();
minTree.prim(graph,1);
}
}
class MinTree{
public void prim(Graph graph,int index){
int visited[]=new int[graph.length];
visited[index]=1;
int min=65535;
int h1=-1;
int h2=-1;
System.out.println("最小生成树:");
for (int i=1;i<graph.length;i++){
for (int j=0;j<graph.length;j++){
for (int k=0;k<graph.length;k++){
if (visited[j]==1&&visited[k]==0&&min>graph.matrix[j][k]){
min=graph.matrix[j][k];
h1=j;
h2=k;
}
}
}
visited[h2]=1;
System.out.println("<"+h1+","+h2+"> 距离"+min);
h1=-1;
h2=-1;
min=65535;
}
}
}
class Graph{
char vertex[];
int matrix[][];
int length;
public Graph(char[] vertex, int[][] matrix) {
this.vertex = vertex;
this.matrix = matrix;
this.length = vertex.length;
}
}
总结:从index点开始,找出连通index顶点最小的边,把这条边的终点加入到visited数组中,然后遍历visited数组中为1的点,依次遍历这些顶点,找出连通这些顶点中最小的边,依次加入,直到所有的顶点全被遍历。