適用於無向圖
package graphModel;
import java.util.Arrays;
public class Prim {
public static int inf = 1000;
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.初始化圖結構
int[][] graph = { { 0, 50, 60, inf, inf, inf, inf }, { 50, 0, inf, 65, 40, inf, inf },
{ 60, inf, 0, 52, inf, inf, 45 }, { inf, 65, 52, 0, 50, 30, 42 }, { inf, 40, inf, 50, 0, 70, inf },
{ inf, inf, inf, 30, 70, 0, inf }, { inf, inf, 45, 42, inf, inf, 0 } };
int N = graph.length;
int start = 0;
int index = 0;
int[] prims = new int[N];
int[] edges = new int[N]; //保留連接該定點的上一個頂點
int[] weights = new int[N]; // 頂點間邊的權值
prims[index] = start;// prim最小生成樹中第一個數是起始點start。
index++;
// 初始化權值爲起始點到其餘個點的距離
for (int i = 0; i < N; i++) {
weights[i] = graph[start][i];
if(weights[i]==0 || weights[i]==inf)
edges[i]=-1;
else
edges[i]=start;
}
weights[start]=-1;//表示start已經進入最小生成樹
//選出另外N-1個頂點
for (int i = 1; i < N; i++) {
int j = 0;
int v = 0;
int min = inf;
// 在未被加入到最小生成樹的頂點中,找出權值最小的頂點。
while (j < N) {
// 若weights[j]=-1,意味着第j個節點已經加入了最小生成樹。
if (weights[j] != -1 && weights[j] < min) {
min = weights[j];
v = j;
}
j++;
}
prims[index] = v;// 將第v個頂點加入到最小生成樹的結果數組中
index++;
weights[v] = -1;// 將"第v個頂點的權值"標記爲-1,意味着第個頂點已經加入了最小樹。
for (j = 0; j < N; j++) {
// 當第j個節點沒有被處理,並且需要更新時才被更新。
if (weights[j] != -1 && graph[v][j] < weights[j]) {
weights[j] = graph[v][j];
edges[j]=v;//第j個節點的上一個頂點爲v
}
}
}
//輸出頂點集
System.out.println( Arrays.toString(prims));
//輸出邊集
for(int i=0; i<N; i++) {
if(edges[i]!=-1)
System.out.println(edges[i]+"->"+i);
}
}
}