1. 关于图
什么是图?
图是表示各种关系的 节点 和 边 的集合:
- 节点 是与对象对应的顶点;
- 边 是对象之间的连接;
- 图的边有时会有 权重,表示节点之间的连接的强度(或一些其他属性)。
以下内容纯属自己理解:
1.1 无向图
没有方向的图,比如图1:
连接两个节点之间的边,设置了权重。因为是要探索Dijkstra算法,所以可以将这个权重直接理解为点到点之间的距离大小。
另外注意:
0节点 到 1节点 的直接距离为 4,那么同时 1节点 到 0节点 的直接距离也为 4。0节点 与 1节点 直接双向互通,不论从谁直接到谁距离都相同。
假设没有直接相连的连个节点间不能直接互达,设置距离为∞;
自己到自己的距离当然为0。
这里我们就可以设置一个 9 × 9 的 邻接矩阵 来表示互相之间的距离。
注意:m行n列对应的数值 代表 m节点 到 n节点 之间的距离
对应图1设置邻接矩阵如下:
//定义整数类型的正无穷
//Integer biggest = Integer.MAX_VALUE报出warning:Type may be primitive
//意思是类型可以是基本类型,所以将 biggest 的类型从 Integer 改为 int
int biggest = Integer.MAX_VALUE;
int[][] graph = new int[][]{
//0号节点到其它各个节点的距离
{
0, 4, biggest, biggest, biggest, biggest, biggest, 8, biggest},
//1号节点到其它各个节点的距离
{
4, 0, 8, biggest, biggest, biggest, biggest, 3, biggest},
//2号节点到其它各个节点的距离
{
biggest, 8, 0, 7, biggest, 4, biggest, biggest, 2},
//3号节点到其它各个节点的距离
{
biggest, biggest, 7, 0, 9, 14, biggest, biggest, biggest},
//4号节点到其它各个节点的距离
{
biggest, biggest, biggest, 9, 0, 10, biggest, biggest, biggest},
//5号节点到其它各个节点的距离
{
biggest, biggest, 4, 14, 10, 0, 2, biggest, biggest},
//6号节点到其它各个节点的距离
{
biggest, biggest, biggest, biggest, biggest, 2, 0, 6, 6},
//7号节点到其它各个节点的距离
{
8, 3, biggest, biggest, biggest, biggest, 6, 0, 1},
//8号节点到其它各个节点的距离
{
biggest, biggest, 2, biggest, biggest, biggest, 6, 1, 0}
};
1.2 有向图
有向图 的边带有方向。比如下面图2:
注意:1节点 能够直接到达 4节点,然而从 4节点 却不能直接到达 1节点(但是有可能可以间接到达)。
0节点 到 7节点 的距离为 8,而此时从 7节点 回到 0节点 的距离则为 12。
可以理解为:
从起点去终点时,道路畅通,距离为8;想从终点回到起点时,却发现前方路段施工,那当然就需要绕行了,距离变为了12。(当然也可能是去终点时施工,回起点时畅通。)
那么根据图2,设置邻接矩阵为: