最小生成樹----克魯斯卡爾演算法----java版
阿新 • • 發佈:2018-11-26
踉踉蹌蹌寫出來了,原理我基本懂了,但是感覺有點講不出來,這裡只貼一下程式碼:
圖如上:
package cn.nrsc.graph; /** * * @author 孫川 最小生成樹-克魯斯卡爾演算法 * */ public class Graph_Kruskal { // ------ 邊實體---------- class Edge { private int begin; private int end; private int weight; public Edge(int begin, int end, int weight) { this.begin = begin; this.end = end; this.weight = weight; } } // ------ 邊實體---------- private Edge[] edges; // 邊陣列 private int edgeSize; // 邊的數量 public Graph_Kruskal(int edgeSize) { this.edgeSize = edgeSize; this.edges = new Edge[edgeSize]; } // 生成邊陣列 public void createEdges() { edges[0] = new Edge(4, 7, 7); edges[1] = new Edge(2, 8, 8); edges[2] = new Edge(0, 1, 10); edges[3] = new Edge(0, 5, 11); edges[4] = new Edge(1, 8, 12); edges[5] = new Edge(3, 7, 16); edges[6] = new Edge(1, 6, 16); edges[7] = new Edge(5, 6, 17); edges[8] = new Edge(1, 2, 18); edges[9] = new Edge(6, 7, 19); edges[10] = new Edge(3, 4, 20); edges[11] = new Edge(3, 8, 21); edges[12] = new Edge(2, 3, 22); edges[13] = new Edge(3, 6, 24); edges[14] = new Edge(4, 5, 26); } // 克魯斯卡爾演算法 public void Kruskal() { // 初始化"迴環判斷"陣列 int[] fromTo = new int[edgeSize]; int sum = 0; // 從權重最小的邊開始,如果沒有形成迴環,則該邊是滿足條件的邊 for (int i = 0; i < edgeSize; i++) { int n = find(fromTo, edges[i].begin); int m = find(fromTo, edges[i].end); if (n != m) { fromTo[n] = m; System.out.println(); System.out.println("起始頂點:" + edges[i].begin + "---->結束頂點:" + edges[i].end); sum += edges[i].weight; } else { System.out.println("第" + i + "條邊出現了迴環"); } } System.out.println("最小生成樹的總距離為:" + sum); } private int find(int[] p, int f) { System.out.print("|||***> " + f); while (p[f] > 0) { f = p[f]; System.out.print("----> " + f); } return f; } public static void main(String[] args) { Graph_Kruskal graph = new Graph_Kruskal(15); graph.createEdges(); graph.Kruskal(); } }