1. 程式人生 > >JS實現普里姆 ( Prim )演算法

JS實現普里姆 ( Prim )演算法

普里姆演算法列印最小生成樹:

∞ 我們程式碼中用65535表示

//定義鄰接矩陣
let Arr2 = [
    [0, 10, 65535, 65535, 65535, 11, 65535, 65535, 65535],
    [10, 0, 18, 65535, 65535, 65535, 16, 65535, 12],
    [65535, 65535, 0, 22, 65535, 65535, 65535, 65535, 8],
    [65535, 65535, 22, 0, 20, 65535, 65535, 16, 21],
    [65535, 65535, 65535, 20, 0, 26, 65535, 7, 65535],
    [
11, 65535, 65535, 65535, 26, 0, 17, 65535, 65535], [65535, 16, 65535, 65535, 65535, 17, 0, 19, 65535], [65535, 65535, 65535, 16, 7, 65535, 19, 0, 65535], [65535, 12, 8, 21, 65535, 65535, 65535, 65535, 0], ] let numVertexes = 9, //定義頂點數 numEdges = 15; //定義邊數 // 定義圖結構 function MGraph() {
this.vexs = []; //頂點表 this.arc = []; // 鄰接矩陣,可看作邊表 this.numVertexes = null; //圖中當前的頂點數 this.numEdges = null; //圖中當前的邊數 } let G = new MGraph(); //建立圖使用 //建立圖 function createMGraph() { G.numVertexes = numVertexes; //設定頂點數 G.numEdges = numEdges; //設定邊數 //錄入頂點資訊 for (let i = 0; i < G.numVertexes; i++) { G.vexs[i]
= 'V' + i; //scanf('%s'); //ascii碼轉字元 //String.fromCharCode(i + 65); } console.log(G.vexs) //列印頂點 //鄰接矩陣初始化 for (let i = 0; i < G.numVertexes; i++) { G.arc[i] = []; for (j = 0; j < G.numVertexes; j++) { G.arc[i][j] = Arr2[i][j]; //INFINITY; } } console.log(G.arc); //列印鄰接矩陣 } function MiniSpanTree_Prim() { let min, i, j, k; let adjvex = []; // 儲存相關頂點下標 let lowcost = []; // 儲存相關頂點間的權值 for (i = 0; i < G.numVertexes; i++) { lowcost[i] = G.arc[0][i]; //將V0頂點與之有邊的權的權值存入陣列 adjvex[i] = 0; //初始化都為v0的下標 } for (i = 1; i < G.numVertexes; i++) { min = 65535; j = 0; k = 0; while (j < G.numVertexes) { if (lowcost[j] != 0 && lowcost[j] < min) { //如果權值不為0且小於min min = lowcost[j]; k = j; } j++; } lowcost[k] = 0; //將當前頂點的權值設定為0,表示此頂點已完成任務 // console.log('(%d,%d,%d)', adjvex[k], k, min); //列印當前頂點邊中權值最小邊,和權值 console.log('(%s,%s,%d)', G.vexs[adjvex[k]], G.vexs[k], min); //列印頂點名稱和權值 for (j = 0; j < G.numVertexes; j++) { //迴圈所有頂點 if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j]) { //若下標為k頂點各邊權值小於此前這些頂點未被加入生成樹權值 lowcost[j] = G.arc[k][j]; //將較小權值存入 lowcost adjvex[j] = k; } } } } createMGraph(); console.log('**********列印最小生成樹*********'); MiniSpanTree_Prim();

 

執行結果:

 

 構造過程如下圖加粗黑線: