基本思想:
設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條邊。設計圖的鄰接矩陣數據結構
public class MGraph {
/*圖的鄰接矩陣表示*/
int vexs; //圖中結點數目
char data[]; //存放結點數據
int [][]weight; //存放邊
public MGraph(int ve){
vexs=ve;
data=new char[ve];
weight=new int[ve][ve];
}
}
- 最小生成樹算法
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);
}
}