最小生成树之克鲁斯卡尔算法 ( java版)
生活随笔
收集整理的這篇文章主要介紹了
最小生成树之克鲁斯卡尔算法 ( java版)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 圖數據如下
二 ?Java代碼
package leaning.graph;import java.util.ArrayList; import java.util.List;import leaning.graph.entity.Edge;/** 克魯斯卡爾最小生成樹* */ public class KruskalMiniCostSpanningTree {//計數器private int counter = 0 ; private int[] parent = new int[9];//邊集合private List<Edge> edgesList = new ArrayList<Edge>();//最大Int整數,表示無窮大private int MAX_VALUE = Integer.MAX_VALUE;//定義節點private String nodes[] = {"vo","v1","v2","v3","v4","v5","v6","v7","v8"};//定義地圖變量private int map[][] = new int[9][9]; public KruskalMiniCostSpanningTree(){this.initMap();this.initEdages();}//初始化地圖public void initMap(){this.map[0] = new int[]{ 0, 10,MAX_VALUE,MAX_VALUE,MAX_VALUE, 11,MAX_VALUE,MAX_VALUE,MAX_VALUE};this.map[1] = new int[]{ 10, 0, 18,MAX_VALUE,MAX_VALUE,MAX_VALUE, 16,MAX_VALUE, 12};this.map[2] = new int[]{MAX_VALUE,MAX_VALUE, 0, 22,MAX_VALUE,MAX_VALUE,MAX_VALUE,MAX_VALUE, 8};this.map[3] = new int[]{MAX_VALUE,MAX_VALUE, 22, 0, 20,MAX_VALUE,MAX_VALUE, 16, 21};this.map[4] = new int[]{MAX_VALUE,MAX_VALUE,MAX_VALUE, 20, 0, 26,MAX_VALUE, 7,MAX_VALUE};this.map[5] = new int[]{ 11,MAX_VALUE,MAX_VALUE,MAX_VALUE, 26, 0, 17,MAX_VALUE,MAX_VALUE};this.map[6] = new int[]{MAX_VALUE, 16,MAX_VALUE,MAX_VALUE,MAX_VALUE, 17, 0, 19,MAX_VALUE};this.map[7] = new int[]{MAX_VALUE,MAX_VALUE,MAX_VALUE, 16, 7,MAX_VALUE, 19, 0,MAX_VALUE};this.map[8] = new int[]{MAX_VALUE, 12, 8, 21,MAX_VALUE,MAX_VALUE,MAX_VALUE,MAX_VALUE, 0};}//初始化邊和權的list集合public void initEdages(){Edge v0 = new Edge(4,7,7);Edge v1 = new Edge(2,8,8);Edge v2 = new Edge(0,1,10);Edge v3 = new Edge(0,5,11);Edge v4 = new Edge(1,8,12);Edge v5 = new Edge(3,7,16);Edge v6 = new Edge(1,6,16);Edge v7 = new Edge(5,6,17);Edge v8 = new Edge(1,2,18);Edge v9 = new Edge(6,7,19);Edge v10 = new Edge(3,4,20);Edge v11 = new Edge(3,8,21);Edge v12 = new Edge(2,3,22);Edge v13 = new Edge(3,6,24);Edge v14 = new Edge(4,5,26);this.edgesList.add(v0);this.edgesList.add(v1);this.edgesList.add(v2);this.edgesList.add(v3);this.edgesList.add(v4);this.edgesList.add(v5);this.edgesList.add(v6);this.edgesList.add(v7);this.edgesList.add(v8);this.edgesList.add(v9);this.edgesList.add(v10);this.edgesList.add(v11);this.edgesList.add(v12);this.edgesList.add(v13);this.edgesList.add(v14);}//克魯斯卡爾算法public void kruskal(){int n = - 1, m = -1 ,begin,end;for(int i=0 ; i < this.edgesList.size() ;i++){ //遍歷得到每一條邊begin = this.edgesList.get(i).getBegin();end = this.edgesList.get(i).getEnd();n = this.find(begin);m = this.find(end);if(n!=m){ //說明沒有閉合線路this.counter++;this.parent[n] = m;System.out.println(" 第 "+this.counter+" 條邊為 : ( "+this.nodes[this.edgesList.get(i).getBegin()]+" , "+this.nodes[this.edgesList.get(i).getEnd()]+" ) = "+this.edgesList.get(i).getWeight()+" ");}}}public int find(int index){while(this.parent[index] > 0 ){index = this.parent[index];}return index;}public static void main(String[] args) {KruskalMiniCostSpanningTree kruskalMiniCostSpanningTree = new KruskalMiniCostSpanningTree();kruskalMiniCostSpanningTree.kruskal();}}package leaning.graph.entity;/** 克魯斯卡爾->最小生成樹邊實體* */ public 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;}public int getBegin() {return begin;}public void setBegin(int begin) {this.begin = begin;}public int getEnd() {return end;}public void setEnd(int end) {this.end = end;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}}
3 運算結果如下
總結
以上是生活随笔為你收集整理的最小生成树之克鲁斯卡尔算法 ( java版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最小生成树之prim算法
- 下一篇: struts1跳入指定方法