图学习笔记索引
图学习笔记索引(全部)
001自定义输入流In类实现
002背包数据类型Bag实现
003无向图数据类型实现
004基于图的深度优先搜索
005使用深度优先搜索找图中的所有连通分量
005-1基于深度优先搜索查找图中连通路径
006基于深度优先搜索判断图中是否存在环
007基于深度优先搜索判断一个无向图图是否是一个二分图
008广度优先搜索查找连通图中的最短路径
009有向图数据类型实现
010有向图的可达性
011带权重的无向边数据类型Edge实现
012加权无向图数据类型实现
本文参考《算法(第4版)》
有向图数据类型实现
1.从文件中读取图
从文件中读取有向图的顶点关系。
tinyDG.txt文件中的第一行为顶点数,第二行为边数。
第三行到最后是两个相邻的顶点:
13
22
4 2
2 3
3 2
6 0
0 1
2 0
11 12
12 9
9 10
9 11
8 9
10 12
11 4
4 3
3 5
7 8
8 7
5 4
0 5
6 4
6 9
7 6
背包类(符号表)的实现参考:https://blog.csdn.net/m0_37692918/article/details/102742999
2.代码实现
package algorithms.graph;
import java.io.IOException;
import algorithms.model.Bag;
/*
* 有向图数据类型实现
* 无向图具有对称性,有向图具有有向性
* */
public class Digraph {
private final int V;
private int E;
private Bag<Integer>[] adj;
public Digraph(int V){
//按边数构造一幅有向图,可通过addEdge()方法添加边
this.V = V;
this.E = 0;
this.adj = (Bag<Integer>[])new Bag[V];
for(int v = 0; v < V; v++)
adj[v] = new Bag<Integer>();
}
public Digraph(In in){
//从文件中读取,构造有向图
this(in.readInt());
this.E = 0; //初始化边数
int edges = in.readInt();
for(int i = 0; i < edges; i++){
int v = in.readInt();
int w = in.readInt();
adj[v].add(w); //有向边
this.E++;
}
}
public int V() { return this.V; }
public int E() { return this.E; }
public void addEdge(int v, int w){
adj[v].add(w);
E++;
}
public Iterable<Integer> adj(int v){
return adj[v];
}
public Digraph reverse(){
Digraph R = new Digraph(V);
for(int v = 0; v < V; v++)
for(int w : adj[v])
R.addEdge(w, v);
return R;
}
@Override
public String toString(){
String s = V + " vectors; " + E +" edges" + "\n";
for(int v = 0; v < V; v++){
s += v + ": ";
for(int w : adj[v])
s += w +" ";
s += "\n";
}
return s;
}
public static void main(String[] args) throws IOException {
In in = new In("D:\\tinyDG.txt");
Digraph D = new Digraph(in);
System.out.println(D);
System.out.println();
//有向图取反
System.out.println(D.reverse());
}
}
输出:
13 vectors; 22 edges
0: 5 1
1:
2: 0 3
3: 5 2
4: 3 2
5: 4
6: 9 4 0
7: 6 8
8: 7 9
9: 11 10
10: 12
11: 4 12
12: 9
13 vectors; 22 edges
0: 6 2
1: 0
2: 4 3
3: 4 2
4: 11 6 5
5: 3 0
6: 7
7: 8
8: 7
9: 12 8 6
10: 9
11: 9
12: 11 10
3.总结
代码实现了有向图的数据类型和常用操作方法,和无向图相比,有向图的边具有方向性,有指出顶点和指向顶点,在构造有向图的邻接表数组时,索引数组只存放该顶点指向的所有顶点。