1. 程式人生 > >MST(最小生成樹)-Prime演算法

MST(最小生成樹)-Prime演算法

Prime演算法的核心步驟是:在帶權連通圖中V是包含所有頂點的集合, U已經在最小生成樹中的節點,從圖中任意某一頂點v開始,此時集合U={v},重複執行下述操作:在所有u∈U,w∈V-U的邊(u,w)∈E中找到一條權值最小的邊,將(u,w)這條邊加入到已找到邊的集合,並且將點w加入到集合U中,當U=V時,就找到了這顆最小生成樹。

       其實,演算法的核心步驟就是:在所有u∈U,w∈V-U的邊(u,w)∈E中找到一條權值最小的邊。

import java.util.*;
public class Prime {
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int V=in.nextInt();
            int E=in.nextInt();
            int graph[][]=new int[V+1][V+1];
            for(int i=0;i<=V;i++){
                for(int j=0;j<=V;j++){
                    graph[i][j]=Integer.MAX_VALUE;
                }
            }
            //無向圖
            for(int i=0;i<E;i++){
                int x=in.nextInt();
                int y=in.nextInt();
                int value=in.nextInt();
                if(graph[x][y]>value){
                    graph[x][y]=value;
                    graph[y][x]=value;
                }
            }
            Queue<String> ans=f_prime(graph,1,V);
            //列印結果
            while(ans.size()>0){
                System.out.println(ans.poll());
            }
        }
    }
    public static Queue f_prime(int graph[][],int start,int V){
        Queue<String> ans=new LinkedList<String>();
        //儲存權值
        int dist[]=new int[V+1];
        //儲存前驅
        int pre[]=new int[V+1];
        //使用最簡單的初始化方式
        for(int i=0;i<=V;i++) {
            dist[i]=Math.min(Integer.MAX_VALUE,graph[start][i]);
            pre[i]=start;
        }
        int visit[]=new int[V+1];
        visit[start]=1;
        //新增V-1次
        for(int i=1;i<=V-1;i++){
            int mindist=Integer.MAX_VALUE;
            //找到最小的
            for(int j=1;j<=V;j++){
                if(visit[j]==0 && mindist>dist[j]){
                    start=j;
                    mindist=dist[j];
                }
            }
            visit[start]=1;
            for(int j=1;j<=V;j++){
                if(dist[j]>graph[start][j] && visit[j]==0){
                    dist[j]=graph[start][j];
                    pre[j]=start;
                }
            }
            ans.add(pre[start]+" "+start+" "+mindist);
        }
        return ans;
    }
}