修路問題
1.本質:最小生成樹問題
2.最小生成樹(mst),minimum cost spanning tree,給定乙個帶權的無向連通圖,選取一棵生成樹,使樹上所有邊上權的總和為最小
(1) n個頂點,一定有n-1條邊
(2) 包含全部頂點
(3) n-1條邊都在圖中
克魯斯卡爾(kruskal)演算法求最小生成樹
1.基本思想:按照權值從小到大的順序選擇n-1條邊,並保證這n-1條邊不構成迴路
2.步驟
(1)構造乙個只含n個頂點的森林
(2)依權值從小到大從連通網中選擇邊加入到森林中,並使森林中不產生迴路,直至森林變成一棵樹為止
3.判斷是否形成迴路
(1)記錄頂點在"最小生成樹"中的終點
(2)將所有頂點按照從小到大的順序排列,某個頂點的終點就是「在最小生成樹中與它連通的最大頂點」
**實現
public class kruskal ;
int matrix = ,,,
,,,};
graph graph = new graph(vertexes, matrix);
minimumcostspanningtree minimumcostspanningtree = new minimumcostspanningtree();
minimumcostspanningtree.kruskal(graph);
}}class minimumcostspanningtree
}system.out.println("最小生成樹");
for (int i = 0; i < select; i++)
}}//帶權無向圖
class graph }}
}//根據邊的權值,從小到大氣泡排序
public void sortedges(edge edges) }}
}//獲取頂點的下標
public int getindex(char vertex)
}return -1;
}//獲取圖中的所有邊,及邊兩邊頂點
public edge getedges() }}
return edges;
}//獲取下標為i的頂點的終點
//ends:記錄各頂點對應終點下標,該陣列在生成最小生成樹有動態變化
public int getend(int ends, int i)
return i;
}}//邊
class edge
@override
public string tostring() ';
}}
kruskal克魯斯卡爾演算法
給定乙個帶權的無向連通圖,如何選取一棵生成樹,使樹上所有邊上權的總和為最小,這叫最小生成樹.求最小生成樹的演算法 1 克魯斯卡爾演算法 圖的存貯結構採用 邊集陣列 且權值相等的邊在陣列中排列次序可以是任意的.該方法對於邊相對比較多的不是很實用,浪費時間 方法 將圖中邊按其權值由小到大的次序順序選取,...
克魯斯卡爾演算法 Kruskal
克魯斯卡爾 kruskal 演算法是一種按權值的遞增次序選擇合適的邊來構造最小生成樹的方法。假設g v,e 是乙個具有 n 個頂點的帶權連通圖,t u,t e 是g 的最小生成樹,則構造最小生成樹的步驟如下 1 設定 u的初值等於 v 即包含有 g中的全部頂點 te 的初值為空集 即圖 t 中每乙個...
克魯斯卡爾 Kruskal 演算法
設g v,e 是具有n個頂點的連通網,t u,te 是其最小生成樹。初值 u v,te 對g中的邊按權值大小從小到大依次選取。選取權值最小的邊 vi,vj 若邊 vi,vj 加入到te後形成迴路,則捨棄該邊 邊 vi,vj 否則,將該邊併入到te中,即te te 重複 直到te中包含有n 1條邊為止...