目录
图的概念
图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
一个图可以用数学语言描述为G(V(G),E(G))。V(vertex)指的是图的顶点集,E(edge)指的是图的边集。一个图可以使用顶点集和边集来描述。
图的分类
图分为有向图和无向图,有向图中的边有起点端和终点端,而无向图没有指向,节点之间只有连接关系。
图的矩阵表示
图的矩阵描述常用的是邻接矩阵法。
在无向图中,邻接矩阵 C 中的某个元素 cij 有两个取值 0 和 1,当 i 节点和 j 节点相邻连通时取 1,否则取 0。上面的无向图的邻接矩阵可以写成如下的形式,可以发现无向图的邻接矩阵是一个对称矩阵。
C=⎡⎣⎢⎢⎢⎢⎢⎢0111010101110101010101010⎤⎦⎥⎥⎥⎥⎥⎥ C = [ 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ]
在有向图中,邻接矩阵
C 中的某个元素
c
ij 也有两个取值 0 和 1,当以
i 节点为起点存在指向
j 节点的有向边时取1,否则取 0。上面的有向图的邻接矩阵可以写成如下的形式,可以发现有向图的邻接矩阵一般不是一个对称矩阵。
C=⎡⎣⎢⎢⎢⎢⎢⎢0000010000110001010001010⎤⎦⎥⎥⎥⎥⎥⎥ C = [ 0 1 1 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 ]
若把邻接矩阵中的元素1用节点间的距离代替,这时就称这个图为加权图,对应的邻接矩阵为加权邻接矩阵。加权图可以用来计算两个节点之间的最短路等问题。
最短路问题和Dijkstra算法
图中具有最大长度的路称为最长路,包含每个顶点的路称为Hamilton路,两点间距离最短的路称为最短路。
其中,最短路可以使用Dijkstra算法计算。该算法的原理较为直观,相关资料也可以查到,故不再赘述。
在Matlab中有可以计算最短路的函数,先用digraph生成加权图,再用shortestpath计算最短路。
以下Matlab代码可以计算上面有向图中节点 1 到 5 的最短路,path是最短路的路径,distance是最短距离。
a = [1,1,1,2,2,3,4]; % 起点节点
b = [2,3,4,3,5,4,5]; % 终点节点
c = [3,2,2,1,3,4,3]; % 对应权值
g = digraph(a,b,c); % 创建图
[path,distance] = shortestpath(g,1,5); % 计算最短路
另外,可以通过plot(g)
绘制图g。