相关定义
图 由顶点和边组成的结构
顶点 图中的元素节点,如上图中的A,B,C等
边(弧) 顶点之间的关系连线,如果边是有向(或者点对有序的),则图也会被叫做有向图。
边的表示(A, B),同时也说明A,B邻接
度 顶点邻接的顶点数目
图的存储方式
1.邻接矩阵
对于上边的有向图,可以通过邻接矩阵的方式来表示:
当图中顶点的度比较低时,我们说图是稀疏的,对应的矩阵也被称为稀疏矩阵
2.邻接表
当图是稀疏的时候,可以通过邻接表来表示:
对于每一个顶点,使用一个表来存放所有邻接的顶点
3. 图形结构的搜索
起点 | 0 | 1 | 0 |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 终点 | 0 |
0 | 0 | 0 | 1 |
对应的邻接矩阵为:
/*
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
*/
3.1 深度优先搜索 DFS
从某个顶点A开始,遍历节点A的邻接顶点,在遍历过程中,递归调用深度优先搜索。
计算起点到终点的最短路径:
public class DepthFirstSearch {
private static class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
return x == point.x &&
y == point.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
'}';
}
}
// 表示5行4列
static int m = 5, n = 4;
// 用于保存顶点是否邻接
private static int[][] values = new int[m][n];
/// 用于标记顶点是否已经遍历
private static boolean[][] marks