MST(最小生成樹)-Prime演算法
阿新 • • 發佈:2018-11-09
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; } }