一、图的基本概念
1.图的概念
图论中的图(Graph)是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
一个图可以用数学语言描述为G(V(G),E(G))。V(vertex)指的是图的顶点集,E(edge)指的是图的边集。其中 V={v1, ... , vN},E= {e1, ... , eM}。(也就是说,V是节点的集合,即所谓的点集,E是连接两点的线即两点间关系的集合,即所谓的边集)
- 根据边是否有方向,可将图分为有向图和无向图。
- 另外,有些图的边上还可能有权值,这样的图称为有权图。
举个小例子(①有权图):
(有向图)
附:一般论文描述时需要出现的术语
- 边和它的两端点称为互相关联
- 与同一条边关联的两个端点称为相邻的顶点,与同一个顶点关联的两条边称为相邻的边.
- 端点重合为一点的边称为环,端点不相同的边称为连杆.
- 若一对顶点之间有两条以上的边联结,则这些边称为重边.
- 既没有环也没有重边的图,称为简单图.
- 任意两顶点都相邻的简单图,称为完全图. 记为Kv.
- 图 K1,n叫做星.
赋权图和子图
- 定义 若图 的每一条边e 都赋以一个实数w(e),称w(e)为边e的权,G 连同边上的权称为赋权图.
- 定义 设和 是两个图.
- 1) 若 ,称 是 G的一个子图,记
- 2)若,则称是G的生成子图.
- 3)若,且 ,以 为顶点集,以两端点均在中的边的全体为边集的图G的子图,称为G的由导出的子图,记为
- 4)若,且,以为边集,以 的端点集为顶点集的图G的子图,称为G 的由 导出的边导出的子图,记为
图的矩阵表示
(1)无向图的权重矩阵表示
(2)有向图的权重邻接矩阵
关联矩阵
- 最短路径问题及算法
最短路径问题的两种方法:Dijkstra和Floyd算法Dijkstra算法采用的是一种贪心的策略,声明一个数组dis来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T,初始时,原点 s 的路径权重被赋为 0 (dis[s] = 0)。若对于顶点 s 存在能直接到达的边(s,m),则把dis[m]设为w(s, m),同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大。初始时,集合T只有顶点s。
首先,从dis数组选择最小值,则该值就是源点s到该值对应的顶点的最短路径,并且把该点加入到T中,OK,此时完成一个顶点,然后,我们需要看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就替换这些顶点在dis中的值。最后,又从dis中找出最小值,重复上述动作,直到T中包含了图的所有顶点。
Dijkstra算法运行时的优点主要是:算法简明、能得到最优解。
算法的主要缺点是:算法运算效率低(特别是有时候不需要最优解)、运算中占用空间大。
Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行|V|次SPFA算法。
优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
缺点:时间复杂度比较高,不适合计算大量数据。