prim算法,求最小生成樹

適用於無向圖

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);
        }
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章