1.Kruskal算法

Kruskal算法基于贪心,因此它追求的是近似最优解,也就是说由Kruskal得出的生成树并不一定是最优解。

Kruskal算法求最小生成树的关键在于,每次选取图中权值最小(及贪心),并不会构成环的边,直到所有点都被囊括。一般,边的个数=点的个数-1。

如下无向图:

要找到最小生成树,克鲁斯卡尔算法的步骤如下:

2.Java实现

针对上述《算法导论》中的例子,有Java代码如下:

 import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator; //图类 无向图
class G{
ArrayList<V> vs=new ArrayList<V>();
ArrayList<E> es=new ArrayList<E>(); public void addV(V v) {
vs.add(v);
} public void add(E e) {
es.add(e);
}
} //点
class V{
String name;
boolean isvisited=false; public V(String name) {
this.name=name;
} @Override
public String toString() {
return name;
}
} //边
class E{
V v1; //点
V v2; //点
int Weight; //权重
boolean isvisited=false; public E(V v1,V v2,int Weight) {
this.v1=v1;
this.v2=v2;
this.Weight=Weight;
} @Override
public String toString() {
return "(" + v1 + ", " + v2 + ":" + Weight + ")";
}
} public class MinTree {
//克鲁斯卡尔
static void kruskal(G graph) {
ArrayList<E> edges=graph.es; //存储图的边集合
ArrayList<E> forest=new ArrayList<E>(); //存放符合结果的边 for(E e:edges) { //遍历边集合,在初始化图的时候,边已按照权值排序
ArrayList<E> testForest=refreshForest(forest);
getEnd(testForest,e.v1,e.v2);
if(endV) { //判断是否形成回路
System.out.print(e); //输出符合条件(不形成回路,权值最小)的边
forest.add(e);
}
}
} //将图的边集合按权值排序
static ArrayList<E> sortEdgeByWeight(ArrayList<E> es){
for(int i=0;i<es.size();i++) {
for(int j=0;j<es.size();j++) {
if(es.get(i).Weight<es.get(j).Weight) {
Collections.swap(es, i, j);
}
}
}
return es;
} static boolean endV=true;
//判断新的边是否会和已有森林形成环:即得到目标点的末节点,由此判断两者是否相同,若相同则有环
static void getEnd(ArrayList<E> testForest,V start,V end) {
for(E e:testForest) {
if(e.isvisited==false) {
if(e.v1.equals(start)) {
e.isvisited=true;
if(e.v2.equals(end)) {
endV=false;
}else {
getEnd(testForest,e.v2,end);
}
}else if (e.v2.equals(start)) {
e.isvisited=true;
if(e.v1.equals(end)) {
endV=false;
}else {
getEnd(testForest,e.v1,end);
}
}
}
}
} //刷新森林:将森林中所有边标为未被查看,将endV标志也初始化一下
static ArrayList<E> refreshForest(ArrayList<E> forest) {
endV=true;
for(E e:forest) {
e.isvisited=false;
}
return forest;
} public static void main(String[] args) {
// TODO Auto-generated method stub
//创建点
V a=new V("a");
V b=new V("b");
V c=new V("c");
V d=new V("d");
V e=new V("e");
V f=new V("f");
V g=new V("g");
V h=new V("h");
V i=new V("i");
//创建点 //创建边
E e0=new E(a,b,4);
E e1=new E(a,h,8);
E e2=new E(b,h,11);
E e3=new E(b,c,8);
E e4=new E(h,i,7);
E e5=new E(h,g,1);
E e6=new E(i,c,2);
E e7=new E(i,g,6);
E e8=new E(c,d,7);
E e9=new E(c,f,4);
E e10=new E(g,f,2);
E e11=new E(d,f,14);
E e12=new E(d,e,9);
E e13=new E(f,e,10);
//创建边 //创建图
G graph=new G();
graph.addV(a);
graph.addV(b);
graph.addV(c);
graph.addV(d);
graph.addV(e);
graph.addV(f);
graph.addV(g);
graph.addV(h);
graph.addV(i);
ArrayList<E> es=new ArrayList<E>();
es.add(e0);
es.add(e1);
es.add(e2);
es.add(e3);
es.add(e4);
es.add(e5);
es.add(e6);
es.add(e7);
es.add(e8);
es.add(e9);
es.add(e10);
es.add(e11);
es.add(e12);
es.add(e13);
graph.es=sortEdgeByWeight(es);
//创建图 //输出图
ArrayList<V> vertexs=graph.vs;
ArrayList<E> edges=graph.es;
Iterator iVertex=vertexs.iterator();
Iterator iEdge=edges.iterator();
System.out.println("点集合:");
while(iVertex.hasNext()) {
System.out.print(iVertex.next());
}
System.out.println();
System.out.println("边集合:");
while(iEdge.hasNext()) {
System.out.print(iEdge.next());
}
//输出图 //最小生成树
//克鲁斯卡尔
System.out.println("");
System.out.println("克鲁斯卡尔:");
kruskal(graph);
//最小生成树 } }

输出:

图-最小生成树算法之Kruskal及其Java实现的更多相关文章

  1. 最小生成树算法 prim kruskal两种算法实现 HDU-1863 畅通工程

    最小生成树 通俗解释:一个连通图,可将这个连通图删减任意条边,仍然保持连通图的状态并且所有边权值加起来的总和使其达到最小.这就是最小生成树 可以参考下图,便于理解 原来的图: 最小生成树(蓝色线): ...

  2. 最小生成树算法总结(Kruskal,Prim)

    今天复习最小生成树算法. 最小生成树指的是在一个图中选择n-1条边将所有n个顶点连起来,且n-1条边的权值之和最小.形象一点说就是找出一条路线遍历完所有点,不能形成回路且总路程最短. Kurskal算 ...

  3. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

  4. 无向带权图的最小生成树算法——Prim及Kruskal算法思路

    边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...

  5. 如何在 Java 中实现最小生成树算法

    定义 在一幅无向图 \(G=(V,E)\) 中,\((u, v)\) 为连接顶点 \(u\) 和顶点 \(v\) 的边,\(w(u,v)\) 为边的权重,若存在边的子集 \(T\subseteq E\ ...

  6. Kruskal 最小生成树算法

    对于一个给定的连通的无向图 G = (V, E),希望找到一个无回路的子集 T,T 是 E 的子集,它连接了所有的顶点,且其权值之和为最小. 因为 T 无回路且连接所有的顶点,所以它必然是一棵树,称为 ...

  7. java数据结构_笔记(5)_图的算法

    图的算法 1 图的遍历图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问一次.遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础. 2 深度优先遍历从图中某个顶点V 出发 ...

  8. 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind

    最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...

  9. 最小生成树算法(Prim,Kruskal)

    边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...

随机推荐

  1. 3942: [Usaco2015 Feb]Censoring

    3942: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MB Submit: 964 Solved: 480 [Subm ...

  2. [USACO08NOV]Mixed Up Cows

    嘟嘟嘟 一看n那么小,那一定是状压dp了(表示从没写过,慌). 首先dp[i][j](i 是一个二进制数,第x位为1代表选了第x头牛),表示 i 这个状态最后一头牛是第 j 头牛时的方案数. 然后当 ...

  3. js中使用trim

    function trim(s) { return trimRight(trimLeft(s)); } //去掉左边的空白 function trimLeft(s) { if (s == null) ...

  4. Mac app打包成dmg

    1. 找到打包的app文件,在Xcode工程的Products目录下 2. 在桌面新建一个文件夹dmg,将app文件放进去. 3. 为了实现拖拽到Application的效果,需要在这个文件夹里放一个 ...

  5. week3编程作业: Logistic Regression中一些难点的解读

    %% ============ Part : Compute Cost and Gradient ============ % In this part of the exercise, you wi ...

  6. 第11章 GPIO输出-使用固件库点亮LED—零死角玩转STM32-F429系列

    第11章     GPIO输出—使用固件库点亮LED 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku. ...

  7. laravel 5.5 《电商实战 》安装应用

    最近开始接触电商业务.公司打算采用lavarel做后端的开发,出于学习成本和时间的考虑.自己找到了一个不错的收费教程.这段时间会同步更新,分享自己的学习过程. 自己的开发环境,mac+nginx+my ...

  8. json keyname map

    var obj = { fname:'zhao', lname:'yao', parents:{ father:'zhao' }, children:[ { dname:'zhaoyiyi' } ] ...

  9. 大数据入门第八天——MapReduce详解(四)本地模式运行与join实例

    一.本地模式调试MR程序 1.准备 参考之前随笔的windows开发说明处:http://www.cnblogs.com/jiangbei/p/8366238.html 2.流程 最重要的是设置Loc ...

  10. Python连接MySQL数据库执行sql语句时的参数问题

    由于工作需要,今天写了一个Python小脚本,其中需要连接MySQL数据库,在执行sql命令时需要传递参数,结果出问题了.在网上查了一下,发现有以下几种方式传递参数: 一.直接把sql查询语句完整写入 ...