▶ 书中第四章部分程序,加上自己补充的代码,图的深度优先遍历

● 无向图的广度优先遍历,有向 / 无向图代码仅若干方法名不同

 package package01;

 import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.Graph;
import edu.princeton.cs.algs4.Stack;
import edu.princeton.cs.algs4.Queue; public class class01
{
private static final int INFINITY = Integer.MAX_VALUE;
private boolean[] marked; // 顶点是否已被遍历
private int[] edgeTo; // 每个顶点在 s - v 路径中的父顶点
private int[] distTo; // 每个顶点在 s - v 路径中的路径长 public class01(Graph G, int s)
{
marked = new boolean[G.V()];
distTo = new int[G.V()];
edgeTo = new int[G.V()];
for (int v = 0; v < G.V(); v++)
distTo[v] = INFINITY;
nonRecursiveBFS(G, s);
//assert check(G, s);
} private void nonRecursiveBFS(Graph G, int s)
{
Queue<Integer> q = new Queue<Integer>();
distTo[s] = 0;
marked[s] = true;
for (q.enqueue(s); !q.isEmpty();)
{
int v = q.dequeue();
for (int w : G.adj(v))
{
if (!marked[w])
{
edgeTo[w] = v;
distTo[w] = distTo[v] + 1;
marked[w] = true;
q.enqueue(w);
}
}
}
} private void nonRecursiveBFS(Graph G, Iterable<Integer> sources) // 以迭代器元素为起点列表进行遍历
{
Queue<Integer> q = new Queue<Integer>();
for (int s : sources)
{
marked[s] = true;
distTo[s] = 0;
q.enqueue(s);
}
for (;!q.isEmpty();)
{
int v = q.dequeue();
for (int w : G.adj(v))
{
if (!marked[w])
{
edgeTo[w] = v;
distTo[w] = distTo[v] + 1;
marked[w] = true;
q.enqueue(w);
}
}
}
} public boolean marked(int v)
{
return marked[v];
} public int distTo(int v)
{
return distTo[v];
} public Iterable<Integer> pathTo(int v)
{
if (!marked(v))
return null;
Stack<Integer> path = new Stack<Integer>();
int x;
for (x = v; distTo[x] != 0; x = edgeTo[x])
path.push(x);
path.push(x);
return path;
} private boolean check(Graph G, int s)
{
if (distTo[s] != 0)
{
StdOut.println("\n<check> error distance of s.\n");
return false;
}
for (int v = 0; v < G.V(); v++)
{
for (int w : G.adj(v))
{
if (marked(v) != marked(w)) // 检查边正确性
{
StdOut.println("edge " + v + "-" + w);
StdOut.println("marked(" + v + ") = " + marked(v));
StdOut.println("marked(" + w + ") = " + marked(w));
return false;
}
if (marked(v) && (distTo[w] > distTo[v] + 1)) // 检查顶点 v 相连的顶点的距离正确性
{
StdOut.println("edge " + v + "-" + w);
StdOut.println("distTo[" + v + "] = " + distTo[v]);
StdOut.println("distTo[" + w + "] = " + distTo[w]);
return false;
}
}
}
for (int w = 0; w < G.V(); w++)
{
if (!marked(w) || w == s)
continue;
int v = edgeTo[w];
if (distTo[w] != distTo[v] + 1) // 逐边检查距离正确性
{
StdOut.println("shortest path edge " + v + "-" + w);
StdOut.println("distTo[" + v + "] = " + distTo[v]);
StdOut.println("distTo[" + w + "] = " + distTo[w]);
return false;
}
}
return true;
} public static void main(String[] args)
{
In in = new In(args[0]);
int s = Integer.parseInt(args[1]);
Graph G = new Graph(in);
class01 search = new class01(G, s);
for (int v = 0; v < G.V(); v++)
{
if (search.marked(v))
{
StdOut.printf("%d to %d (%d): ", s, v, search.distTo(v));
for (int x : search.pathTo(v))
{
if (x == s)
StdOut.print(x);
else
StdOut.print("-" + x);
}
StdOut.println();
}
else
StdOut.printf("%d to %d (-): not connected\n", s, v);
}
}
}

● 有向图广度优先遍历

 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.Stack;
import edu.princeton.cs.algs4.Queue; public class class01
{
private static final int INFINITY = Integer.MAX_VALUE;
private boolean[] marked;
private int[] edgeTo;
private int[] distTo; public class01(Digraph G, int s)
{
marked = new boolean[G.V()];
distTo = new int[G.V()];
edgeTo = new int[G.V()];
for (int v = 0; v < G.V(); v++)
distTo[v] = INFINITY;
nonRecursiveBFS(G, s);
} private void nonRecursiveBFS(Digraph G, int s)
{
Queue<Integer> q = new Queue<Integer>();
distTo[s] = 0;
marked[s] = true;
for (q.enqueue(s); !q.isEmpty();)
{
int v = q.dequeue();
for (int w : G.adj(v))
{
if (!marked[w])
{
edgeTo[w] = v;
distTo[w] = distTo[v] + 1;
marked[w] = true;
q.enqueue(w);
}
}
}
} private void nonRecursiveBFS(Digraph G, Iterable<Integer> sources)
{
Queue<Integer> q = new Queue<Integer>();
for (int s : sources)
{
marked[s] = true;
distTo[s] = 0;
q.enqueue(s);
}
for (;!q.isEmpty();)
{
int v = q.dequeue();
for (int w : G.adj(v))
{
if (!marked[w])
{
edgeTo[w] = v;
distTo[w] = distTo[v] + 1;
marked[w] = true;
q.enqueue(w);
}
}
}
} public boolean marked(int v)
{
return marked[v];
} public int distTo(int v)
{
return distTo[v];
} public Iterable<Integer> pathTo(int v)
{
if (!marked(v))
return null;
Stack<Integer> path = new Stack<Integer>();
int x;
for (x = v; distTo[x] != 0; x = edgeTo[x])
path.push(x);
path.push(x);
return path;
} public static void main(String[] args)
{
In in = new In(args[0]);
int s = Integer.parseInt(args[1]);
Digraph G = new Digraph(in);
class01 search = new class01(G, s);
for (int v = 0; v < G.V(); v++)
{
if (search.marked(v))
{
StdOut.printf("%d to %d (%d): ", s, v, search.distTo(v));
for (int x : search.pathTo(v))
{
if (x == s)
StdOut.print(x);
else
StdOut.print("->" + x);
}
StdOut.println();
}
else
StdOut.printf("%d to %d (-): not connected\n", s, v);
}
}
}

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

  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 13

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

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

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

随机推荐

  1. Combobox中禁止鼠标中键滚动list列表

    //第1种方法 procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; Mo ...

  2. mongoVUE的增删改查操作使用说明(转)

    mongoVUE连接数据库 http://jingyan.baidu.com/album/9989c7460fd171f648ecfe06.html?picindex=1 mongoVUE操作数据库 ...

  3. java实例检查端口是否被占用

    127.0.0.1代表本机 主要的原理是:Socket socket = new Socket(Address,port);#address代表主机的IP地址,port代表端口号 如果对该主机的特定端 ...

  4. webpack学习总结(一)

    * webpack安装 1. 安装最新node,node自带npm包管理器: 2. 全局模式安装webpack(只有将webpack在全局模式下安装才能在命令行直接通过webpack执行命令) $np ...

  5. bzoj5006: [THUWC2017 Bipartite]随机二分图

    某人在玩一个非常神奇的游戏.这个游戏中有一个左右各 nnn 个点的二分图,图中的边会按照一定的规律随机出现. 为了描述这些规律,某人将这些边分到若干个组中.每条边或者不属于任何组 (这样的边一定不会出 ...

  6. ubuntu16.04下sublime text 3之安装和配置

    1.安装方法 1)使用ppa安装 sudo add-apt-repository ppa:webupd8team/sublime-text-3 sudo apt-get update sudo apt ...

  7. Spring Boot 容器选择 Undertow 而不是 Tomcat

    Spring Boot 内嵌容器Undertow参数设置 配置项: # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 # 不要设置过大,如果过大,启动 ...

  8. 客户端负载均衡Feign之四:Feign配置

    Ribbon配置 在Feign中配置Ribbon非常简单,直接在application.properties中配置即可,如: # 设置连接超时时间 ribbon.ConnectTimeout=500 ...

  9. 协议无关组播-密集模式 PIM-DM

    一.组播路由协议 (一) 路由器依靠转发项来转发组播数据包.转发项的生成则是组播路由协议所要完成的任务.组播路由协议有距离矢量组播路由协议(DVMRP).协议无关组播-密集模式(PIM-DM).协议无 ...

  10. 本机无法访问虚拟机里面的nginx的80端口

    在虚拟机VMware上装好了centos6.9,并配好了nginx,但是本机就是无法访问.具体情况如下1.本机能ping通虚拟机2.虚拟机也能ping通本机3.虚拟机能访问自己的web4.本机无法访问 ...