知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达!
这篇文章主要输出完整的有向图的相关代码,关于无向图和有向图的理论,很多数据结构的书籍都有涉及,网上也有很多的资料,这里就不再赘述了,关于图的主要基本数据结构主要有三种:邻接矩阵、邻接表、十字链表。
这篇文章的代码使用Java实现的,一个基于邻接表结构的不带权值有向图的深度优先遍历、广度优先遍历和最短路径求解。
代码实现思想是从文件中读取图的顶点和路径信息,文件名称是citys.txt,文件的内容如下:
(1)西安
3, 5
(2)洛阳
4, 6
(3)安徽
1 ,4
(4)北京
2, 7, 8
(5)福建
3, 6, 9
(6)杭州
1, 4, 8
(7)深圳
2, 3, 6
(8)苏州
3, 6, 1
(9)中南海
2, 5
上面每两行分别显示了图的顶点信息(城市名称)和路径信息。
图的顶点类型定义
/**
* 定义图的顶点类型
*/
static class Vertex{
public Vertex(String data, LinkedList<Integer> adjList) {
this.data = data;
this.adjList = adjList;
}
String data; // 邻接表数组的数据
LinkedList<Integer> adjList; // 邻接表中的链表
}
图的类型定义
public class Digraph {
// 定义邻接表
private ArrayList<Vertex> adj;
/**
* 初始化邻接表集合
*/
public Digraph(){
adj = new ArrayList<>();
}
}
从文件中读取图的顶点和路径信息创建邻接表
/**
* 从指定的流里面读取邻接表的数据
* @param reader
*/
public void read(BufferedReader reader) throws IOException {
// 给邻接表的第0项添加一个vertex,因为代码上顶点是从1开始编号的
adj.add(new Vertex("", null));
String city = null;
String[] vertex = null;
for(;;){
city = reader.readLine();
if(city == null){
break;
}
LinkedList<Integer> list = new LinkedList<>();
vertex = reader.readLine().split(",");
for (int i = 0; i < vertex.length; i++) {
list.add<