Kruskal生成树算法的java代码简单实现
2014-06-28 15:26
936 查看
package kruskal; import java.util.Arrays; import java.util.Comparator; import java.util.LinkedList; import java.util.List; class EdgeCom implements Comparator<EdgeNode>{ @Override public int compare(EdgeNode o1, EdgeNode o2) { return o1.weight>=o2.weight?1:-1; } } public class Graph { int v; int e; EdgeNode[] edges; public Graph(int v,int e){ this.v = v; this.e = e; edges = new EdgeNode[e]; } public void addEdge(EdgeNode e,int i){ edges[i] = e; } public int find(Subsets[] set,int i){ if(set[i].parent==i){ return i; } set[i].parent = find(set, set[i].parent); return set[i].parent; } public void union(Subsets[] set,int x,int y){ int xp = find(set, x); int yp = find(set, y); if(xp!=yp){ if(set[xp].rank<set[yp].rank){ set[xp].parent = yp; }else if(set[xp].rank>set[yp].rank){ set[yp].parent = xp; }else{ set[xp].parent = yp; set[yp].rank++; } } } public List<EdgeNode> getKruskalTree(){ LinkedList<EdgeNode> list = new LinkedList<>(); Arrays.sort(this.edges, new EdgeCom()); Subsets[] set = new Subsets[v]; for(int i=0;i<v;i++){ set[i] = new Subsets(i, 0); } for(int i=0;i<e;i++){ EdgeNode edge = edges[i]; int src = edge.src; int des = edge.des; int x = find(set, src); int y = find(set, des); if(x!=y){ list.add(edge); } union(set, src, des); } return list; } public void print(List<EdgeNode> list){ for(EdgeNode temp:list){ System.out.println(temp.src+" "+ temp.des+" "+temp.weight+" "); } } public static void main(String[] args) { Graph g = new Graph(7, 9); g.addEdge(new EdgeNode(0, 3, 1), 0); g.addEdge(new EdgeNode(5, 6, 1), 1); g.addEdge(new EdgeNode(0, 1, 2), 2); g.addEdge(new EdgeNode(2, 3, 2), 3); g.addEdge(new EdgeNode(1, 3, 3), 4); g.addEdge(new EdgeNode(0, 2, 4), 5); g.addEdge(new EdgeNode(3, 6, 4), 6); g.addEdge(new EdgeNode(2, 5, 5), 7); g.addEdge(new EdgeNode(4, 6, 6), 8); List<EdgeNode> list = g.getKruskalTree(); g.print(list); } }
package kruskal; public class EdgeNode { int src; int des; int weight; EdgeNode next; <span style="white-space:pre"> </span>public EdgeNode(int src, int des, int weight) { <span style="white-space:pre"> </span>this.src = src; <span style="white-space:pre"> </span>this.des = des; <span style="white-space:pre"> </span>this.weight = weight; <span style="white-space:pre"> </span>} }
package kruskal;public class Subsets {<span style="white-space:pre"> </span>int parent;<span style="white-space:pre"> </span>int rank;<span style="white-space:pre"> </span>public Subsets(int parent, int rank) {<span style="white-space:pre"> </span>this.parent = parent;<span style="white-space:pre"> </span>this.rank = rank;<span style="white-space:pre"> </span>}}
相关文章推荐
- 简单学习二维码生成步骤--java代码实现
- 排序与查找简单算法 java代码实现
- Java使用异或运算实现简单的加密解密算法实例代码
- Kruskal最小生成树算法代码实现(c++)
- 最小生成树之克鲁斯卡尔(Kruskal)算法实现,代码详解!!!!
- java实现图的最小生成树(森林)MST克鲁斯卡尔(Kruskal)算法
- 简单的TFIDF算法实现Java代码
- 抢红包的红包生成算法Java实现代码
- 最小生成树-Prim算法 java代码实现
- 最小生成树-Kruskal算法 java代码实现
- Java生成静态页面的简单方法和代码
- 最小生成树-Kruskal算法 java代码实现
- T4 (Text Template Transformation Toolkit)实现简单实体代码生成
- 简单P -码生成过程的实现及测试代码
- Java实现HTML代码生成PDF文档
- [ASP]无限级分类的简单算法实现及代码重点讲解
- 在java中客户端和服务端简单实现代码
- 数独问题的一种简单算法代码实现
- java实现循环左移和右移的简单算法
- 一个简单的随机数生成算法实现(C++)