java 普里姆(Prim)算法求圖的最小生成樹

  1. 基本思想:
    設G=(V,E)是連通網,T=(U,D)是最小生成樹,V,U是頂點集合,E,D是邊的集合
    ①若從頂點u開始構造最小生成樹,則從集合V中取出頂點u放入集合U中,標記頂點v的visited[u]=1;
    ②若集合U中頂點ui與集合V-U中的頂點vj之間存在邊,則尋找這些邊中權值最小的邊,但不能構成迴路,將頂點vj加入集合U中,將邊(ui,vj)加入集合D中,標記visited[vj]=1;
    ③重複步驟②,直到U與V相等,即所有頂點都被標記爲訪問過,此時D中有n-1條邊。

  2. 設計圖的鄰接矩陣數據結構

public class MGraph {
    /*圖的鄰接矩陣表示*/
    int vexs;  //圖中結點數目
    char data[];  //存放結點數據
    int [][]weight;  //存放邊
    public MGraph(int ve){
        vexs=ve;
        data=new char[ve];
        weight=new int[ve][ve];
    }       
}
  1. 最小生成樹算法
public class MinTree {

    /*創建圖的鄰接矩陣*/
    public void CreateGraph(MGraph graph,int vexs,char data[],int [][]weight){
        int i,j;
        for(i=0;i<vexs;i++){
            graph.data[i]=data[i];
            for(j=0;j<vexs;j++){
                graph.weight[i][j]=weight[i][j];
            }
        }
    }

    public void Prim(MGraph graph,int v){
        /*graph爲圖的鄰接矩陣表示,v爲起始頂點*/
        int visited[]=new int[graph.vexs];  // visited[]標記結點是否被訪問過
        for(int i=0;i<graph.vexs;i++){   //初始化visited[]
            visited[i]=0;
        }

        visited[v]=1;
        int h1=-1,h2=-1;   //記錄邊的弧尾和弧頭
        int minweight=10000;//minweight記錄最小權重
        for(int k=1;k<graph.vexs;k++){  //vexs個頂點,最小生成樹中有vexs-1條邊

            for(int i=0;i<graph.vexs;i++){  //i頂點表示被訪問過的頂點
                for(int j=0;j<graph.vexs;j++){  // j頂點表示未被訪問過的頂點
                    if(visited[i]==1 && visited[j]==0 && graph.weight[i][j]<minweight){
                        //尋找已訪問的頂點與未訪問的定點間的權值最小的邊
                        minweight=graph.weight[i][j];
                        h1=i;
                        h2=j;
                    }
                }
            }

            System.out.println("邊<"+graph.data[h1]+","+graph.data[h2]+"> 權值:"+minweight);
            visited[h2]=1;   //標記h2被訪問過
            minweight=10000;
        }

    }

    public static void main(String args[]){
        char []data=new char[]{'A','B','C','D','E'};
        int vexs=data.length;
        int [][]weight=new int[][]{
                {10000,4,8,5,10000},
                {4,10000,3,10000,7},
                {8,3,10000,6,6},
                {5,10000,6,10000,9},
                {10000,7,6,9,10000}
                };

        MGraph graph=new MGraph(vexs);
        MinTree mt=new MinTree();
        mt.CreateGraph(graph,vexs,data,weight);
        mt.Prim(graph, 0);
    }

}
發佈了34 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章