图的基本结构以及BFS和DFS(递归和非递归)
- 完整的图结构
- 有向图建图以及BFS和DFS
- 无向图建图以及BFS和DFS
- DFS和BFS常见应用
完整的图结构
- 图的每个顶点包括顶点的值、入度、出度、和它相邻的点(或者在有向图中就是下一个可以到达的点)的集合、以及以它为起点出发的边的集合;
- 图的每条边包括边的权值、边的起点、边的终点;
- 一个图包括点的集合和边的集合;
综上可以得到如下的图结构:
1 | //点 (默认我是from的情况下) |
有向图建图以及BFS和DFS
这里使用一个二维矩阵来表示图(每一行都代表输入一条边),第一列表示的是边的起点、第二列是边的终点、第三列是边的权值。如下例子:
使用上面的例子来建图并进行BFS(广度遍历)和DFS(深度遍历)的代码如下: (在遍历的过程中边的集合几乎用不到)
1 | import java.util.*; |
- BFS就是按照到起点的距离(按层次)遍历;
- DFS就是只要某个结点可以往下走,就一直走下去(一条路走到黑),走不了了再回溯回来;
- 其中非递归的DFS使用栈完成,注意,访问某个结点的
next
结点集合的时候,只访问一个,然后结点本身还是要先入栈; - BFS和DFS都要记录某个结点是否已经被访问过;
上面例子的遍历结果:
无向图建图以及BFS和DFS
无向图和有向图的区别就是度没有出度和入度之分,结点的nexts
域、和结点相邻的边集要相互的添加;
看下图的例子:
建图以及BFS和DFS遍历如下: (这里省去了边的集合)
1 | import java.io.BufferedInputStream; |
遍历结果
DFS和BFS常见应用
DFS
: 求一个图的连通分量以及判断两个点是否可通,以及求出任意一条路径;DFS
:求最短路径;
代码:(未测试)
1 | import java.util.ArrayList; |