普利姆(prim)演算法求最小生成樹,也就是在包含n個頂點的連通圖中,找出只有(n-1)條邊包含所有n個頂點的連通子圖,也就是所謂的極小連通子圖。
演算法如下。
1 設g=(v,e)是連通網,t=(u,d)是最小生成樹,v,u是頂點集合,e,d是邊的集合。
2 若從頂點u開始構造最小生成樹,則從集合v中取出頂點u放入集合u中,標記頂點v的visited[u]=1
3 若集合u中頂點ui與集合v-u中的頂點vj之間存在邊,則尋找這些邊中權值最小的邊,但不能構成迴路,將頂點vj加入集合u中,將邊(ui,vj)加入集合d中,標記visited[vj]=1
4 重複步驟②,直到u與v相等,即所有頂點都被標記為訪問過,此時d中有n-1條邊。
public class primalgorithm ;
// 頂點的個數
int verxs = data.length;
// 鄰接矩陣的關係使用二維陣列表示,10000這個大數,表示兩個點不聯通
int weight = new int,,,
,,,,};
// 建立 mgraph 物件
mgraph graph = new mgraph(verxs);
// 建立 mintree 物件
mintree mintree = new mintree();
mintree.creategraph(graph, verxs, data, weight);
// 輸出圖
mintree.showgraph(graph);
// 普利姆演算法
mintree.prim(graph, 1);//
}}/**
* @classname: primalgorithm
* @description: 最小生成樹
*/class mintree }}
/*** 功能描述:顯示圖的鄰接矩陣
*/public void showgraph(mgraph graph)
}/**
* 功能描述:prim演算法,得到最小生成樹
** @param graph 圖
* @param v 表示從圖的第幾個頂點開始生成'a'->0 'b'->1...
*/public void prim(mgraph graph, int v) }}
// 找到一條邊是最小
system.out.println("邊 權值:" + minweight);
// 將當前這個結點標記為已經訪問
visited[h2] = 1;
// minweight 重新設定為最大值 10000
minweight = 10000;}}
}class mgraph
}
普利姆演算法
演算法思想 可取圖中任意乙個頂點v作為生成樹的根,之後若要往生成樹上新增頂點w,則在頂點v和w之間必定存在一條邊。並且該邊的權值在所有連通頂點v和w之間的邊中取值最小。一般情況下,假設n個頂點分成兩個集合 u 包含已落在生成樹上的結點 和v u 尚未落在生成樹上的頂點 則在所有連通u中頂點和v u中...
普利姆演算法
普利姆 prim 這個演算法有什麼用?在實際中這個演算法經常用到電子板的電路連線中,因為可以使用到最少的連線將所有的電子連線起來,又打個比方在鋪設電線將所有使用者連線起來可以使用最少的電線連線起來 知道了這個作用之後你是不是比較感興趣呢?首先看 prim演算法生成最小生成樹 void minispa...
普利姆演算法
演算法思想 可取圖中任意乙個頂點v作為生成樹的根,之後若要往生成樹上新增頂點w,則在頂點v和w之間必定存在一條邊。並且該邊的權值在所有連通頂點v和w之間的邊中取值最小。一般情況下,假設n個頂點分成兩個集合 u 包含已落在生成樹上的結點 和v u 尚未落在生成樹上的頂點 則在所有連通u中頂點和v u中...