public class Mst {
int numberofNode;
int[] lowcost;
ArrayList<Integer> closedSet;
ArrayList<Integer[]> edge;
ArrayList<String> V;
int[][] map;//无向图
public Mst(int numberofNode){
map = new int[numberofNode][numberofNode];
this.numberofNode = numberofNode;
for (int i=0;i<numberofNode;i++){
for(int j = 0; j<numberofNode;j++)
{
map[i][j] = Integer.MAX_VALUE;
}
}
map[0][1]=map[1][0]=4;
map[0][2]=map[2][0]=2;
map[0][3]=map[3][0]=3;
map[1][2]=map[2][1]=5;
map[1][3]=map[3][1]=4;
map[1][4]=map[4][1]=3;
map[2][3]=map[3][2]=1;
map[2][5]=map[5][2]=2;
map[3][4]=map[4][3]=6;
map[3][5]=map[5][3]=2;
map[4][5]=map[5][4]=4;
}
public int prim(){
int curPos = 0;//v0
int result = 0;//for return
closedSet = new ArrayList<Integer>();//U, the vertices set of MST
edge = new ArrayList<Integer[]>();//store the edge of MST
V = new ArrayList<String>();//V, Initialize the vertices set of graph
for(int i = 0; i < numberofNode; i++){
V.add(i+"");
}
closedSet.add(curPos);//put v0 into closedSet
V.remove(curPos+"");
lowcost = new int[numberofNode];//low cost & initialization
for (int i = 0; i<lowcost.length; i++){
lowcost[i] = Integer.MAX_VALUE;
}
while(closedSet.size()<numberofNode){
int min = Integer.MAX_VALUE;
int v=0;//first vertex in V-U set
int u=0;//first vertex in U set
for(int i=0;i<closedSet.size();i++){
for(int j = 0; j<V.size();j++){
int distance = map[closedSet.get(i)][Integer.parseInt(V.get(j))];
if(distance<Integer.MAX_VALUE && distance<min)
{
min = distance;
v = Integer.parseInt(V.get(j));
u = closedSet.get(i);
}
}
}
closedSet.add(v);
V.remove(v+"");
Integer[] e = {u,v};
edge.add(e);
}
for (int i = 0; i<edge.size();i++){
result += map[edge.get(i)[0]][edge.get(i)[1]];
System.out.println(edge.get(i)[0]+"," + edge.get(i)[1]+", "+map[edge.get(i)[0]][edge.get(i)[1]]);
}
return result;
}
public static void main(String[] args){
Mst mst = new Mst(6);
System.out.println(mst.prim());
}
}
(坐标,cost)
最小的总cost之和