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

● 图的前序、后序和逆后续遍历

 package package01;

 import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.Digraph;
import edu.princeton.cs.algs4.EdgeWeightedDigraph;
import edu.princeton.cs.algs4.DirectedEdge;
import edu.princeton.cs.algs4.Queue;
import edu.princeton.cs.algs4.Stack; public class class01
{
private boolean[] marked;
private int[] pre; // 前序顶点列表(索引 -> 顶点)
private int[] post; // 后序顶点列表
private Queue<Integer> preorder; // 前序队列(顶点)
private Queue<Integer> postorder; // 后续队列
private int preCounter; // 前序计数器
private int postCounter; // 后序计数器 public class01(Digraph G)
{
pre = new int[G.V()];
post = new int[G.V()];
postorder = new Queue<Integer>();
preorder = new Queue<Integer>();
marked = new boolean[G.V()];
for (int v = 0; v < G.V(); v++)
{
if (!marked[v])
dfs(G, v);
}
} public class01(EdgeWeightedDigraph G)
{
pre = new int[G.V()];
post = new int[G.V()];
postorder = new Queue<Integer>();
preorder = new Queue<Integer>();
marked = new boolean[G.V()];
for (int v = 0; v < G.V(); v++)
{
if (!marked[v])
dfs(G, v);
}
} private void dfs(Digraph G, int v)
{
marked[v] = true;
pre[v] = preCounter++; // 前序和后序差别在于,将当前顶点加入队列以及递归的先后顺序
preorder.enqueue(v);
for (int w : G.adj(v))
{
if (!marked[w])
dfs(G, w);
}
postorder.enqueue(v);
post[v] = postCounter++;
} private void dfs(EdgeWeightedDigraph G, int v)
{
marked[v] = true;
pre[v] = preCounter++;
preorder.enqueue(v);
for (DirectedEdge e : G.adj(v))
{
int w = e.to();
if (!marked[w])
dfs(G, w);
}
postorder.enqueue(v);
post[v] = postCounter++;
} public int pre(int v)
{
return pre[v];
} public int post(int v)
{
return post[v];
} public Iterable<Integer> pre()
{
return preorder;
} public Iterable<Integer> post()
{
return postorder;
} public Iterable<Integer> reversePost() // 用后续队列生成逆后序栈
{
Stack<Integer> reverse = new Stack<Integer>();
for (int v : postorder)
reverse.push(v);
return reverse;
} public static void main(String[] args)
{
In in = new In(args[0]);
Digraph G = new Digraph(in);
class01 dfs = new class01(G);
StdOut.println(" v pre post");
StdOut.println("--------------");
for (int v = 0; v < G.V(); v++)
StdOut.printf("%4d %4d %4d\n", v, dfs.pre(v), dfs.post(v)); StdOut.print("Preorder: "); // 分别输出前序、后序和逆后序
for (int v : dfs.pre())
StdOut.print(v + " ");
StdOut.println(); StdOut.print("Postorder: ");
for (int v : dfs.post())
StdOut.print(v + " ");
StdOut.println(); StdOut.print("Reverse postorder: ");
for (int v : dfs.reversePost())
StdOut.print(v + " ");
StdOut.println();
}
}

● 传递闭包

 package package01;

 import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.Digraph;
import edu.princeton.cs.algs4.DirectedDFS; public class class01
{
private DirectedDFS[] tc; public class01(Digraph G)
{
tc = new DirectedDFS[G.V()];
for (int v = 0; v < G.V(); v++) // 循环尝试从所有点开始深度优先遍历整个图,返回可达点的迭代器
tc[v] = new DirectedDFS(G, v);
} public boolean reachable(int v, int w)
{
return tc[v].marked(w);
} public static void main(String[] args)
{
In in = new In(args[0]);
Digraph G = new Digraph(in);
class01 tc = new class01(G); StdOut.print(" ");
for (int v = 0; v < G.V(); v++)
StdOut.printf("%3d", v);
StdOut.println("\n--------------------------------------------"); for (int v = 0; v < G.V(); v++)
{
StdOut.printf("%3d: ", v);
for (int w = 0; w < G.V(); w++)
StdOut.printf(tc.reachable(v, w) ? " T" : " ");
StdOut.println();
}
}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. C#之实现Scoket心跳机制

    C#之实现Scoket心跳机制 标签: UnityC#TCPSocket心跳 2017-05-17 09:58 1716人阅读 评论(0) 收藏 举报  分类: Unity(134)  C#(6)  ...

  2. mysql数据字典 如何生成?

    用phpMyAdmin查看表结构,点击 打印预览. &amp;lt;img src="https://pic3.zhimg.com/50/3205ff3bd3da067528f4c1 ...

  3. 53题看透java线程

    1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成 ...

  4. Selenium2+python自动化38-显式等待(WebDriverWait)

    From: https://www.cnblogs.com/yoyoketang/p/6517477.html 前言: 在脚本中加入太多的sleep后会影响脚本的执行速度,虽然implicitly_w ...

  5. Gerrit安装

    1.安装gerrit [sisi@pre-srv44 ~]$ su - gerrit2Password: [gerrit2@pre-srv44 ~]$ lltotal 83872-rw-r--r-- ...

  6. JS属性描述符之Object.defineProperty()定义对象属性特性

    一.Object.defineProperty的作用 用来给对象新增属性,和修改对象中的属性. 二.JS对象中的描述符 js对象中两种属性描述符:数据描述符和存取描述符(访问描述符). 注意事项: 1 ...

  7. bzoj5010: [Fjoi2017]矩阵填数

    Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...

  8. mysql查询优化之三:查询优化器提示(hint)

    目录: <MySQL中的两种临时表>--强制使用临时表 SQL_BUFFER_RESULT <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示( ...

  9. 学习笔记之JavaScript

    JavaScript 教程 | 菜鸟教程 http://www.runoob.com/js/js-tutorial.html JavaScript 是 Web 的编程语言. 所有现代的 HTML 页面 ...

  10. 中级 jQuery 了解

    初级阶段的知识已经结束:中级要接触的东西:jQuery  php  css3  移动端: get Context("2d")   2d画布: draw Image()     绘制 ...