▶ 书中第四章部分程序,包括在加上自己补充的代码,Kruskal 算法和 Boruvka 算法求最小生成树

● Kruskal 算法求最小生成树

 package package01;

 import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.Edge;
import edu.princeton.cs.algs4.EdgeWeightedGraph;
import edu.princeton.cs.algs4.Queue;
import edu.princeton.cs.algs4.MinPQ;
import edu.princeton.cs.algs4.UF; public class class01
{
private double weight;
private Queue<Edge> mst = new Queue<Edge>(); public class01(EdgeWeightedGraph G)
{
MinPQ<Edge> pq = new MinPQ<Edge>(); // 建立最小优先队列
for (Edge e : G.edges())
pq.insert(e);
for (UF uf = new UF(G.V()); !pq.isEmpty() && mst.size() < G.V() - 1;) // 加入生成树的变得集合
{
Edge e = pq.delMin(); // 取权值最小的边
int v = e.either();
int w = e.other(v);
if (!uf.connected(v, w)) // 顶点 v 和 w 没有都在树中,说明添加边 v-w 不会构成环
{
uf.union(v, w); // 添加边,更新生成树的权值
mst.enqueue(e);
weight += e.weight();
}
}
} public Iterable<Edge> edges()
{
return mst;
} public double weight()
{
return weight;
} public static void main(String[] args)
{
In in = new In(args[0]);
EdgeWeightedGraph G = new EdgeWeightedGraph(in);
class01 mst = new class01(G);
for (Edge e : mst.edges())
StdOut.println(e);
StdOut.printf("%.5f\n", mst.weight());
}
}

● Boruvka 算法求最小生成树

 package package01;

 import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.Edge;
import edu.princeton.cs.algs4.EdgeWeightedGraph;
import edu.princeton.cs.algs4.Bag;
import edu.princeton.cs.algs4.UF; public class class01
{
private double weight;
private Bag<Edge> mst = new Bag<Edge>(); public class01(EdgeWeightedGraph G)
{
UF uf = new UF(G.V());
for (int t = 1; t < G.V() && mst.size() < G.V() - 1; t = t + t) // 重复 v-1 次直到得到生成树
{
Edge[] closest = new Edge[G.V()]; // 最小生成树中连接着顶点 v 的边记作 closest[v]
for (Edge e : G.edges())
{
int v = e.either(), w = e.other(v);
int i = uf.find(v), j = uf.find(w);
if (i == j) // 顶点 v 和 w 来自同一棵树,加入边 v-w 会导致环
continue;
if (closest[i] == null || less(e, closest[i])) // v 是新顶点,加入边 v-w 会使得 v 的距离比现在小
closest[i] = e; // 值标记新距离,还没有加入边
if (closest[j] == null || less(e, closest[j])) // w 是新顶点,加入边 v-w 会使得 w 的距离比现在小
closest[j] = e;
}
for (int i = 0; i < G.V(); i++)
{
Edge e = closest[i];
if (e != null) // 存在连着顶点 v 的最小生成树的边
{
int v = e.either(), w = e.other(v); // 正式加入边 v-w
if (!uf.connected(v, w)) // 防止已经在生成书中的边被再次添加
{
mst.add(e);
weight += e.weight();
uf.union(v, w);
}
}
}
}
} public Iterable<Edge> edges()
{
return mst;
} public double weight()
{
return weight;
} private static boolean less(Edge e, Edge f) // 比较两条边的权值
{
return e.weight() < f.weight();
} public static void main(String[] args)
{
In in = new In(args[0]);
EdgeWeightedGraph G = new EdgeWeightedGraph(in);
class01 mst = new class01(G);
for (Edge e : mst.edges())
StdOut.println(e);
StdOut.printf("%.5f\n", mst.weight());
}
}

《算法》第四章部分程序 part 15的更多相关文章

  1. 《算法》第四章部分程序 part 19

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,有边权有向图的邻接矩阵,FloydWarshall 算法可能含负环的有边权有向图任意两点之间的最短路径 ● 有边权有向图的邻接矩阵 package p ...

  2. 《算法》第四章部分程序 part 18

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,在有权有向图中寻找环,Bellman - Ford 算法求最短路径,套汇算法 ● 在有权有向图中寻找环 package package01; impo ...

  3. 《算法》第四章部分程序 part 16

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,Dijkstra 算法求有向 / 无向图最短路径,以及所有顶点对之间的最短路径 ● Dijkstra 算法求有向图最短路径 package packa ...

  4. 《算法》第四章部分程序 part 14

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,两种 Prim 算法求最小生成树 ● 简单 Prim 算法求最小生成树 package package01; import edu.princeton ...

  5. 《算法》第四章部分程序 part 10

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,包括无向图连通分量,Kosaraju - Sharir 算法.Tarjan 算法.Gabow 算法计算有向图的强连通分量 ● 无向图连通分量 pack ...

  6. 《算法》第四章部分程序 part 9

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,两种拓扑排序的方法 ● 拓扑排序 1 package package01; import edu.princeton.cs.algs4.Digraph ...

  7. 《算法》第四章部分程序 part 17

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,无环图最短 / 最长路径通用程序,关键路径方法(critical path method)解决任务调度问题 ● 无环图最短 / 最长路径通用程序 pa ...

  8. 《算法》第四章部分程序 part 13

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,图的前序.后序和逆后续遍历,以及传递闭包 ● 图的前序.后序和逆后续遍历 package package01; import edu.princeto ...

  9. 《算法》第四章部分程序 part 12

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,图的几种补充数据结构,包括无向 / 有向符号图,有权边结构,有边权有向图 ● 无向符号图 package package01; import edu. ...

随机推荐

  1. 如何在Visual Studio 2013中连接中国版的Azure

    http://diaosbook.com/Post/2014/8/23/connect-azure-cn-in-vs2013   VS2013的Server Explorer在第一次连接Azure的时 ...

  2. Android adb 模拟滑动 按键 点击事件

    模拟事件全部是通过input命令来实现的,首先看一下input命令的使用: usage: input ... input text <string>       input keyeven ...

  3. Speeding Up The Traveling Salesman Using Dynamic Programming

    Copied From:https://medium.com/basecs/speeding-up-the-traveling-salesman-using-dynamic-programming-b ...

  4. 黄聪:jquery.bootgrid表格插件有的属性(visibleInSelection、cssClass、headerCssClass、headerAlign)不能识别的解决办法

    主要是属性大小写问题,修改jquery.bootgrid.js文件,在function loadColumns()方法里面添加下面的语句就好了 data.headerAlign = data.head ...

  5. 筛选法求n以内所有的素数

    求n以内所有的素数? 筛选法:将2到n中所有的数都列出来,然后从2开始,先化掉所有2的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其内所有的倍数,最后剩下来的数就都是素数 例:13  红色为 ...

  6. 客户端负载均衡Feign之一:申明式服务调用Feign入门示例

    Spring Cloud提供了Ribbon和Feign作为客户端的负载均衡. 前面使用了Ribbon做客户端负载均衡,使用Hystrix做容错保护,这两者被作为基础工具类框架被广泛地应用在各个微服务的 ...

  7. 在linux下sh批处理文件调用java的方法

    解密 java -classpath collection-impl-0.0.1.jar com.ai.toptea.collection.message.DESEncrypt 1EFE4663895 ...

  8. python:数据类型

    一.数据类型 1.数字int型 主要进行计算 bit_length() 当十进制用二进制表示时,最少使用的位数 a = 13 b = a.bit_length() print (b) 2.布尔值boo ...

  9. [UE4]通过使用Set TimerByFunctionName来实现反射机制

  10. at android.view.LayoutInflater.createViewFromTag的错误原因

    创建对话框时出现下面的错误: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean ...