01 基本概念
1 对于平面上 n 个点,将其中一些点对用边连接起来,形成的关系结构就是一个图。记作 G=(V,E),V 为顶点集,E 为边集。
2 每条边都具有方向的图称为有向图,都不具有方向的图称为无向图,否则称为混合图。
3 任何两个顶点之间最多只有一条边的图称为简单图。
4 如果图中两个顶点有边相连,则这两个顶点相邻,而每一对顶点都相邻的图称为完全图,记作K|v|。
5 若 V=X∪Y,X∩Y=Ø,X≠Ø,Y≠Ø, 且 X、Y 中均无相邻的顶点对,则称图 G 为二分图。特别地,若对于任意 u∈X ,u 与 Y 中每个顶点相邻,则 G 为完全二分图,记作 K|x|,|y|
6 假设点 v∈V 是边 e∈E 的端点,则称 v 与 e 相关联。与某一点关联的边的数目记作该顶点的度,记作 d(v),度数为奇数的顶点叫做奇顶点,否则为偶顶点。可以证明所有顶点度之和为边数的两倍,所以奇顶点的总个数必然是偶数。
7 如果两个顶点存在路线使其连通,则称两顶点关联,这些路线称为道路。起点和终点重合的道路称为回路。所有道路中, 各边不同的道路称为迹,各顶点不同的道路称为轨道,记作 P 。对于 P,起点与终点重合时称为圈;含有所有顶点的轨道称为 Hamilton 轨道,闭合的 Hamilton 轨道称为 Hamilton 圈,含有 Hamilton 圈的图称为 Hamilton 图。
图中任意两顶点之间存在道路的图称为连通图。
8 两顶点间最短的轨道的长度称为这两个顶点的距离。
9 每一条边都有一个或多个实数与之对应的图为赋权图,这些是实数称为权。例如之前提过的TSP问题中的适应度。
02 数据结构计算机中描述、存储图与网络主要用邻接矩阵表示法。
对于具有 n 个顶点的图 G,他的邻接矩阵 A 是 n 阶方阵。矩阵元素表示顶点之间的关系。
对于无向图
对于有向图
对于带权无向图
对于带权有向图
为了更加方便地表示,可以用将邻接矩阵转化为稀疏矩阵。
MATLAB中将矩阵转化为稀疏矩阵的命令是 sparse,将稀疏矩阵变为普通矩阵的是 full。
可以看出,对于无向图,邻接矩阵有对称的形式。稀疏矩阵仅包含邻接矩阵下三角元素中的非零项。
03 最短路径问题1 两个指定顶点之间的最短路径
例如:如下图,某公司在全球有六个分公司,现在要设计航班路线,使得从总部去往其他一个分部花费的票价最少。其中有航班往返的用黑线标出。
自上而下、从左向右将七个城市顺序编号。机票价格如下(单位 k rmb)
![67aba18881dfc371c62de77bfc084d02.png](https://img-blog.csdnimg.cn/img_convert/67aba18881dfc371c62de77bfc084d02.png)
MATLAB 实现该算法如下,解得右边结果。
![ba37959daa776520a6b8464969e4b4d4.png](https://img-blog.csdnimg.cn/img_convert/ba37959daa776520a6b8464969e4b4d4.png)
此类问题也可以转化为0-1规划问题。决策变量 x 取1时表示两顶点取得最短路径。
2 每对顶点之间的最短路径
显然,解决此类多源最短路径问题,可以通过设置不同起点,多次调用 Dijkstra 算法。
另一种方法是 Floyd 算法。
其基本思想是通过递推产生一个矩阵序列 {Ak (k=1,2,…,n)},它的第 i 行第 j 列元素表示顶点 vi 到顶点 vj 路径上经过的顶点序号不大于 k 的最短路径长度。
迭代公式如下:
![093e7ca51827ff2a3b3449600cbae225.png](https://img-blog.csdnimg.cn/img_convert/093e7ca51827ff2a3b3449600cbae225.png)
04 最小生成树问题
首先补充一下需要用到的关于树的一些概念。 对于一棵树 T={D,R} 1 D 是包含 n 个结点的有限集合。 n=0 时, T 为空树。 2 对于非空树,关系集合 R 满足1 有且仅有一个结点 d0∈D,它对于关系 R 来说,没有前驱结点,该结点称为树的根结点。
2 除了根结点外,每个结点有且仅有一个前驱结点。
3 D 中每个结点可以有零个或多个后继结点。
3 没有后继结点的结点叫做叶子结点。 4 关于树的高度、结点的度等概念和满足的性质,可以自行去了解~ 对于一个连通图,它的生成树由图中的全部顶点( n 个)和 n-1 条边构成。一个连通图的生成树不是唯一的。![24e6a8b0b9572210ea57d7100be8cafd.png](https://img-blog.csdnimg.cn/img_convert/24e6a8b0b9572210ea57d7100be8cafd.png)
![cec92f5d8b8d698e455aba6c2289cfeb.png](https://img-blog.csdnimg.cn/img_convert/cec92f5d8b8d698e455aba6c2289cfeb.png)
这就是一个典型的最小生成树问题,以下求解
1 Prim 算法
Prim 算法是一种构造性算法,结合贪心算法,通过不断寻找局部最优加以调整,得到全局最优。
设集合 U 存储顶点,算法具体操作为:
1 初始化 U={v}。U 到所有其他顶点的边为候选边。
2 从候选边中挑选与 U 中叶子结点相连且权值最小的边,将其终点 k 加入 U。同时将这条边从候选边中去除。
3 重复上一步骤,直到所有顶点加入 U,即可得到最小生成树。
![534da7d40db0d9fa5d7f0602f2b98a62.png](https://img-blog.csdnimg.cn/img_convert/534da7d40db0d9fa5d7f0602f2b98a62.png)
2 Kruskal 算法
Kruskal 不断选取权值最小的边(但不能有回路),操作如下:
1 初始选取 e1∈E(G),e1 是权值最小的边。
2 依次从 E(G)-{e1,e2,…,ei-1} 中选取 ei (i=2,3,…,n-1),满足 {e1,e2,…,ei} 中无圈,并且 ei 是 E(G)-{e1,e2,…,ei-1} 中权值最小的边。
![b3959f4411113525f23d0f91a145c74a.png](https://img-blog.csdnimg.cn/img_convert/b3959f4411113525f23d0f91a145c74a.png)
![a6227adc3374d29add8e1fc9988e78d5.png](https://img-blog.csdnimg.cn/img_convert/a6227adc3374d29add8e1fc9988e78d5.png)
刚好这学期在数据结构这门课有学一些树和图论的内容,写在这里正好也当做复预习。
图还可以经过拓展形成网络,关于这部分内容,就先搁着等搞一搞学业还有就是学一学 Lingo 这个软件之后再说。