基础算法–有向图 以及有向图图的一些环检测、拓扑排序、可达性检测基础 java描述
文章目录
前言
提示:这是一篇《算法第四版》的读后笔记,不会提供main测试,当中案例主要导入随书资料的自定义的类库提示:以下是本篇文章正文内容,下面案例可供参考
一、有向图的数据类型
当中的addEdge方法其实和无向图类似,只变为了单向表示。这里主要使用的室邻接矩阵来表示图,表示方法有以下说明
1、对于邻接矩阵,我们将使用V*V的布尔数组表示顶点,如果有v和w的顶点,v-w相连接,那么adj[v][w]与adj[w][v]为true。但是需要留意,如果数据是上百万的顶点,那么V*V的空间大小是不能满足的。
2、庞大数据我们可以考虑邻接表,如下图,bag对象也可以用set代替,c++代码可以使用vector
提示:这里对文章进行总结:
建图代码如下,其核心在于,要怎么表示邻接表的数据结构,我们创建adj的bag对象数组作为邻接表,其索引是顶点表示,bag对象中将会存储索引中所有相邻的顶点。在addEdge中,我们会添加v-w这是有向图的表示方法,在建图完成之后,就可以进行一些无向图的基本操
/*
* @param V 这是图中的边数
*/
public class Digraph{
private final int V; //顶点数
private int E; //边数表示
private Bag<Integer>[] adj; //邻接表顶点的相邻顶点,这个可以用其它可变长度数组替代,c++可以使用vector,
/* 构造函数中,主要目的是初始化“邻接表”, */
public Digraph(int V){
this.V = V;
this.E = 0; //一开始我们的边是没有链接的(初始化阶段)
adj = (Bag<Integer>[])new Bag[V]; //接下来就是创建邻接表
for(int v = 0;v < V;v++){
adj[v] = new Bag<Integer>();
}
}
/* 以下两个是辅助方法,客户代码中,有时候会希望获取到边数和定点数 */
public int getV(){
return V;
}
public int gerE(){
return E;
}
/*
* 相比无向图少了一个adj[w].add(v),
*
* param V与w这是两个将要链接的顶点
*/
public void addEdage(int v,int w){
adj[v].add(w);
E++;
}
/*
* 有时我们会希望能够使用迭代,比如范围for循环中使用。
*
* param v 顶点
* return v顶点所有相邻顶点
*/
public Iterable<Integer>adj(int v){
return adj[v]
}
/*
* 在处理有向图会比较有用,后续的例子会看到
*
* return 返回一个有向图副本,但是这是相对于原图的翻转结果
*/
public Digraph reverse(){
Digraph R = new Digraph(V);