㈠ 图论算法的教材
我想很多学习图论的人都知道J.A. Bondy和U.S.R. Murty着的《Graph Theory with Application》(Elsevier,1976)是图论教材中的经典,时至今日,仍不失为初学者较好的入门书。还记得兰州交通大学的张忠辅教授说过,国内第一届图论学会就是把大家集中起来学习邦迪的《Graph Theory with Application》,由此可见这本书对国内图论届的影响是如此之大。吴望名等人将其译成中文版本《图论及其应用》(北京:科学出版社,1984),1988年张克民等人编写了该书的参考答案《图论及其应用习题解答》(清华大学出版社,1988)。
在2008年J.A. Bondy和U.S.R. Murty出了新书《Graph Theory》(GTM 244, Springer, 2008), 大家可不妨将其看成是《Graph Theory with Application》的第二版,这本书在内容上做了重新调整,毕竟在第一版出版后的近30年里涌现出了很多新的结果,所以《Graph Theory》在内容上加进了一些新的结果,这本书我只是读了其中的几章,觉得写的非常棒,建议大家能够读读,这里也值得一提的是将第一版最后提出的50个问题进行了更新,并补充了一些新的问题。总之,我个人认为,《Graph Theory》的确是一部很优秀的图论教材。
中国科学技术大学出版社出版的《图论及其算法》,融有向图和无向图为一整体,系统地阐述了图论的基本概念、理论、方法及其算法,内容包括图的基本概念、Euler图与Hamilton图、图论算法、树及其应用、平面图、独立集与匹配、网络流和Petri网。 书中附有大量例题和习题,而且大部分习题有详细解答。 该书选材精炼全面,内容处理恰当且有新意,立论严谨,叙述条理清晰,语言流畅。 该书可用作高校计算机、电子、信息、管理、数学等专业本科生必修课教材,也可供相关专业的研究人员、教师及图论工作者参考。
㈡ 图论算法及其MATLAB实现的图书目录
第1章 图论的基础知识1
1.1图论的起源1
1.2着名的图论学者——欧拉1
1.3图2
1.4特殊图类3
1.5有向图4
1.6图的矩阵表示5
1.6.1邻接矩阵5
1.6.2关联矩阵5
1.7图论的基本性质和定理6
1.8计算有向图的可达矩阵的算法及其MATLAB实现6
1.9关联矩阵和邻接矩阵的相互转换算法及其MATLAB实现7
习题一11
第2章 最短路12
2.1路12
2.2最短路问题13
2.3求连通图最短距离矩阵的算法及其MATLAB实现14
2.4求两点间最短路的Dijkstra算法及其MATLAB实现15
2.4.1 Dijkstra算法16
2.4.2 Dijkstra算法的MATLAB实现16
2.5求两点间最短路的改进的Dijkstra算法及其MATLAB实现18
2.5.1 Dijkstra矩阵算法Ⅰ18
2.5.2 Dijkstra矩阵算法Ⅱ18
2.6 求两点间最短路的WarshallFloyd算法及其MATLAB实现21
2.6.1 Floyd算法的基本思想22
2.6.2 Floyd算法的基本步骤22
2.6.3 WarshallFloyd算法的MATLAB实现22
2.7求任意两点间最短路的算法及其MATLAB实现25
2.8求从一固定点到其他所有点最短路的算法及其MATLAB实现27
2.9求必须通过指定两个点的最短路的算法及其MATLAB实现29
2.10求图的两顶点间最短路与次短路的算法及其MATLAB实现32
2.11求最大可靠路的算法及其MATLAB实现34
2.12求最大期望容量路的算法及其MATLAB实现36
习题二38
第3章 连通图40
3.1判断图的连通性算法及其MATLAB实现40
3.2连通图的中心和加权中心的算法及其MATLAB实现42
3.3连通无向图一般中心的算法及其MATLAB实现44
习题三46
第4章 树48
4.1树及其性质48
4.2割点、割边、割集50
4.3二元树与Huffman树51
4.3.1有序二元树51
4.3.2 Huffman树51
4.4求Huffman树及其MATLAB实现52
4.5广度优先搜索算法及其MATLAB实现55
4.6深度优先搜索算法及其MATLAB实现57
4.7求割点算法及其MATLAB实现61
4.8生成树及其个数65
4.9求无向图的生成树算法及其MATLAB实现67
4.10求有向图的生成树算法及其MATLAB实现69
4.11求有向连通图的外向树与内向树数目的算法及其MATLAB实现71
4.12最小生成树问题73
4.13求最小生成树的Kruskal算法及其MATLAB实现74
4.13.1 Kruskal算法的基本思想74
4.13.2 Kruskal算法的MATLAB实现74
4.14求最小生成树的Prim算法及其MATLAB实现76
4.14.1 Prim算法的基本思想76
4.14.2 Prim算法的MATLAB实现77
习题四79
第5章Euler图和Hamilton图81
5.1 Euler图81
5.2“一笔画”问题及其理论81
5.3中国邮递员问题82
5.4 Fleury算法及其MATLAB实现82
5.4.1 Fleury算法的步骤82
5.4.2 Fleury算法的MATLAB实现82
5.5 Hamilton图87
5.6旅行售货员问题88
5.7改良圈算法及其MATLAB实现89
习题五92
第6章 匹配问题及其算法93
6.1问题起源——婚配问题93
6.2二分图的有关知识93
6.3匹配、完美匹配、最大匹配93
6.4匹配的基本定理94
6.5应用案例——BernolliEuler错放信笺问题95
6.6寻求图的一个较大基数匹配算法及其MATLAB实现95
6.7人员分配问题97
6.8匈牙利算法及其MATLAB实现97
6.8.1匈牙利算法基本步骤97
6.8.2匈牙利算法的MATLAB实现98
6.8.3案例及其MATLAB实现100
6.9最优分配问题101
6.10 KuhnMunkres算法及其MATLAB实现101
6.10.1 KuhnMunkres算法的基本思想101
6.10.2利用可行顶点标记求最佳匹配的KuhnMunkras算法步骤102
6.10.3 KuhnMunkres算法的MATLAB实现102
6.10.4简单实验105
习题六107
第7章 网络流的算法108
7.1网络、流和割108
7.1.1网络和流108
7.1.2割109
7.2网络的最大流问题110
7.3最大流最小割定理110
7.4 FordFulkerson标号算法及其MATLAB实现111
7.4.1 FordFulkerson标号算法的基本步骤111
7.4.2 FordFulkerson 标号算法的MATLAB实现112
7.4.3案例及其MATLAB实现113
7.5 Dinic算法及其MATLAB实现114
7.5.1 Dinic算法的基本思想114
7.5.2 Dinic算法的MATLAB实现115
7.5.3案例
㈢ 图论的基本概念有哪些
图论基本概念
重要定义:
有向图:每条边都是有向边的图。
无向图:每条边都是无向边的图。
混合图:既有有向边又有无向边的图。
自回路:一条边的两端重合。
重数:两顶点间若有几条边,称这些边为平行边,两顶点a,b间平行边的条数成为(a,b)的重数。
多重图:含有平行边的图。
简单图:不含平行边和自回路的图。
注意!一条无向边可以用一对方向相反的有向边代替,因此一个无向图可以用这种方法转化为一个有向图。
定向图:如果对无向图G的每条无向边指定一个方向由此得到的有向图D。称为的G定向图.
底图:如果把一个有向图的每一条有向边的方向都去掉,得无向图G称为的D底图。
逆图:把一个有向图D的每条边都反向由此得到的图称为D的逆图。
赋权图:每条边都赋上了值。
出度:与顶点相连的边数称为该定点的度数,以该定点为始边的边数为出度。 入度:以该定点为终边的边数为入度。
特殊!度数为零的定点称为孤立点。度数为一的点为悬挂点。
无向完全图:在阶无向图中如果任何两点都有一条边关连则称此图是无向完全图。Kn
完全有向图:在阶有向图中如果任意两点都有方向相反的有向边相连则称此图为完全有向图。
竟赛图:阶图中如果其底图是无向完全图,则程此有向完全图是竟塞图。
注意!n阶有向完全图的边数为n的平方;无向完全图的边数为n(n-1)/2。
下面介召图两种操作:①删边:删去图中的某一条边但仍保留边的端点。
②删点:删去图中某一点以及与这点相连的所有边。
子图:删去一条边或一点剩下的图。
生成子图:只删边不删点。
主子图:图中删去一点所得的子图称的主子图。
补图:设为阶间单无向图,在中添加一些边后,可使成为阶完全图;由这些添加边和的个顶点构成的图称为的补图。
重要定理:
定理5.1.1 设图G是具有n个顶点m条边的有向图,其中点集V={v,v,….,v}
deg+(vi)=deg-(vi)=m
定理5.1.2 设图G是具有n个顶点m条边的无向图,其中点集V={v,v,v,……,v}
deg(vi)=2m
推论 在无向图中,度数为积数的顶点个数为偶数。
通路和富权图的最短通路
1通路和回路
基本概念:
通路的长度:通路中边的条数。
回路:如果通路中始点与终点相同。
简单通路:如果通路中各边都不相同。
基本通路:如果通路中各顶点都不相同。显然(基本通路一定是简单通路,但简单通路不一定是基本通路)
可达:在图G中如果存在一条v到d通路则称从v到d是可达。
连通:在无向图中如果任意两点是可达的,否则是不连通的。
强连通:在有向图中如果任意两点是互可达的。
单向连通:在有向图中如果存在任意两点的通路。
弱连通:在有向图中如果其底图是连通的。
权:在图的点或边上表明某种信息的数。
赋权图:含有权的图。
赋权图的最短通路问题的算法:先求出到某一点的最短通路,然后利用这个结果再去确定到另一点的最短通路,如此继续下去,直到找到到的最短通路为止。
指标:设V是图的点集,T是V的子集,且T含有z但不含a,则称T为目标集。在目标集T中任取一个点t,由a到t但不通过目标集T中其它点所有通路中,个边权和的最小者称为点t关与T的指标记作DT(t)。
图和矩阵
住意两个的区别:A·A 中元素的意义:当且仅当a 和a 都是1时,a a =1而a 和a 都为1意味着图G中有边(v ,v )和(v ,v )。于是可得如下结论:从顶点v 和v 引出的边,如果共同终止于一些顶点,则这些终止顶点的数目就是b 的值;特别对于b ,其值就是v 的出度。
A ·A中元素的意义:当且仅当a 和a 都为1时,a a =1,这意味着图中有边(v ,v )和(v ,v )。于是的得如下结论:从某些点引出的边,如果同时终止于v 和v ,则这样的顶点数就是的值。特别对于b ,其值就是的v 入度。
幂A 中元素的意义:当m=1时,a 中的元素=1,说明存在一条边(v ,v ),或者说从v 到v 存在一条长度为一的通路。
A 中元素a 表示从v 到v 的长度为m的所有通路的数目。
欧拉图
主要定义:
如果图中存在一条通过图中个边一次且仅一次的回路,则称此回路为欧拉回路,具有欧拉回路的图称为欧拉图。
如果图中存在一条通过图中各边一次且仅一次的通路,则称此回路为欧拉通路,具有欧拉通路的图称为半欧拉图。
主要定理:一个无向连通图是欧拉图的充要条件是图中各点的度数为偶数。
一个无向连通图是半欧拉图的充要条件是图中至多有两个奇数度点。
设图G是有向连通图,图G是欧拉图的充要条件是图中每个顶点的入度和出度相等。
设图G是有向连通图,图G是半欧拉图的充要条件是至多有两个顶点,其中一个顶点入度比它的出度大1,另一个顶点入度比它的出度少1;而其他顶点的入度和出度相等。
哈密顿图
主要定义:如果图G中存在一条通过图G中各个顶点一次且仅一次的回路,则称此回路为图的哈密顿回路;具有哈密顿回路的图称为哈密顿图。
如果图G中存在一条通过图G中各个顶点一次且仅一次的回路,则称此回路为图的哈密顿回路;具有哈密顿回路的图称为哈密顿图。
主要定理:设图G是哈密顿图,如果从G中删去个p顶点得到图G’,则图G’的连通分支数小于等于p。
设图G是具有n个顶点的无向简单图,如果G中任意两个不同顶点的度数之和大于等于n-1,则具有哈密顿通路,即G是半哈密顿图。
设图G是具有n个顶点的无向简单图,如果G中任意两个不同顶点的度数之和大于等于n,则G具有哈密顿回路,即G是哈密顿图。
㈣ 如何判断一个图是否是连着的图论,算法
连通图的特点是图中任意两点都是连通的,也就是说只要从任意一点出发能够到达所有的点就能够证明是连通图,否则就是不连通图
因为不知道你准备采用什么,具体算法我就不写语言了,只是解释一下原理:
1 采用数组、链表或数组,先将所有顶点定义在数组POINT中。
2 采用二维数组,将所有边(线段)定义在二维数组LINE中,记录两遍,边的两个顶点分别作为第一项如(v0,v3)(v3,v0)。
3 取出一个顶点v0加入到新数组CONPOINT中,并在顶点数组POINT中删除。
4 while循环,停止条件是CONPOINT中都标记着已读
{
从CONPOINT中取出一个有未读标记的顶点X,并作已读标记。
从二维数组LINE中查找第一项中包含X的边,将选出边的第二个顶点(1个或多个)取出,并加入到新数组CONPOINT中,并作未读标记(如果已有该点则不作插入)
将选出的边从二维数组LINE中删除。
}
比较CONPOINT和POINT数量,如果少了则不是连通图
㈤ 数学建模第四章 图论 part4.2最短路径问题-Dijkstra算法
1.Dijkstra算法介绍
算法特点:
迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。
算法的思路
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中包含了图的所有顶点。
2、Dijkstra算法示例演示
我求下图,从顶点v1到其他各个顶点的最短路径.
首先第一步,我们先声明一个dis数组,该数组初始化的值为:
我们的顶点集T的初始化为:T={v1}
既然是求 v1顶点到其余各个顶点的最短路程,那就先找一个离 1 号顶点最近的顶点。通过数组 dis 可知当前离v1顶点最近是 v3顶点。当选择了 2 号顶点后,dis[2](下标从0开始)的值就已经从“估计值”变为了“确定值”,即 v1顶点到 v3顶点的最短路程就是当前 dis[2]值。将V3加入到T中。
为什么呢?因为目前离 v1顶点最近的是 v3顶点,并且这个图所有的边都是正数,那么肯定不可能通过第三个顶点中转,使得 v1顶点到 v3顶点的路程进一步缩短了。因为 v1顶点到其它顶点的路程肯定没有 v1到 v3顶点短.
OK,既然确定了一个顶点的最短路径,下面我们就要根据这个新入的顶点V3会有出度,发现以v3 为弧尾的有: < v3,v4 >,那么我们看看路径:v1–v3–v4的长度是否比v1–v4短,其实这个已经是很明显的了,因为dis[3]代表的就是v1–v4的长度为无穷大,而v1–v3–v4的长度为:10+50=60,所以更新dis[3]的值,得到如下结果:
因此 dis[3]要更新为 60。这个过程有个专业术语叫做“松弛”。即 v1顶点到 v4顶点的路程即 dis[3],通过 < v3,v4> 这条边松弛成功。这便是 Dijkstra 算法的主要思想:通过“边”来松弛v1顶点到其余各个顶点的路程。
然后,我们又从除dis[2]和dis[0]外的其他值中寻找最小值,发现dis[4]的值最小,通过之前是解释的原理,可以知道v1到v5的最短距离就是dis[4]的值,然后,我们把v5加入到集合T中,然后,考虑v5的出度是否会影响我们的数组dis的值,v5有两条出度:< v5,v4>和 < v5,v6>,然后我们发现:v1–v5–v4的长度为:50,而dis[3]的值为60,所以我们要更新dis[3]的值.另外,v1-v5-v6的长度为:90,而dis[5]为100,所以我们需要更新dis[5]的值。更新后的dis数组如下图:
然后,我们使用同样原理,分别确定了v6和v2的最短路径,最后dis的数组的值如下:
因此,从图中,我们可以发现v1-v2的值为:∞,代表没有路径从v1到达v2。所以我们得到的最后的结果为:
㈥ 数据结构——图graph(基础概念)
【各种东拼西凑来的】
图(Graph)是由顶点和连接顶点的边构成的离散结构。在计算机科学中,图是最灵活的数据结构之一,很多问题都可以使用图模型进行建模求解。例如:生态环境中不同物种的相互竞争、人与人之间的社交与关系网络、化学上用图区分结构不同但分子式相同的同分异构体、分析计算机网络的拓扑结构确定两台计算机是否可以通信、找到两个城市之间的最短路径等等。
图的结构很简单,就是由顶点$V$集和边$E$集构成,因此图可以表示成$G=(V, E)$。
注意: 顶点有时也称为节点或者交点,边有时也称为链接。
无向图
我们可以说这张图中,有点集$V=\{1, 2, 3, 4, 5, 6\}$,边集$E=\{(1, 2), (1, 5), (2, 3), (2, 5), (3, 4), (4, 5), (4, 6)\}$。在无向图中,边$(u, v)$和边$(v, u)$是一样的,因此只要记录一个就行了。简而言之,对称。
有向图
也很好理解,就是加上了方向性,顶点$(u, v)$之间的关系和顶点$(v,u)$之间的关系不同,后者或许不存在。例如,地图应用中必须存储单行道的信息,避免给出错误的方向。
加权图 :
权:与图的边或弧相关的数叫做权。
与加权图对应的就是无权图,或叫等权图。如果一张图不含权重信息,我们就认为边与边之间没有差别。不过,具体建模的时候,很多时候都需要有权重,比如对中国重要城市间道路联系的建模,总不能认为从北京去上海和从北京去广州一样远(等权)。
还有很多细化的概念,比如:无向图中,任意两个顶点间都有边,称为 无向完全图 ;加权图起一个新名字,叫 网(network) ……然而,如无必要,毋增实体。
邻接(adjacency) :邻接是 两个顶点之间 的一种关系。如果图包含$(u,v)$,则称顶点$v$与顶点$u$邻接。当然,在无向图中,这也意味着顶点$u$与顶点$v$邻接。
关联(incidence) :关联是 边和顶点之间 的关系。在有向图中,边$(u,v)$从顶点$u$开始关联到$v$,或者相反,从$v$关联到$u$。注意,有向图中,边不一定是对称的,有去无回是完全有可能的。细化这个概念,就有了顶点的 入度(in-degree) 和 出度(out-degree) 。无向图中,顶点的度就是与顶点相关联的边的数目,没有入度和出度。在有向图中,我们以图1-2为例,顶点10有2个入度,$3\rightarrow10$,$11\rightarrow10$,但是没有从10指向其它顶点的边,因此顶点10的出度为0。
路径(path) :依次遍历顶点序列之间的边所形成的轨迹。注意,依次就意味着有序,先1后2和先2后1不一样。
简单路径 : 没有重复顶点的路径称为简单路径。说白了,这一趟路里没有出现绕了一圈回到同一点的情况,也就是没有 环 。
环/回路 :包含相同的顶点两次或者两次以上。图1-3中的顶点序列$<1,2,4,3,1>$,1出现了两次,当然还有其它的环,比如$<1,4,3,1>$。
简单回路/简单环: 除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路
无环图 :没有环的图,其中, 有向无环图 有特殊的名称,叫做 DAG(Directed Acyline Graph) (最好记住,DAG具有一些很好性质,比如很多动态规划的问题都可以转化成DAG中的最长路径、最短路径或者路径计数的问题)。
两个连通分支:
连通的 :无向图中每一对不同的顶点之间都有路径。如果这个条件在有向图里也成立,那么就是 强连通 的。
连通分量 :无向图中的极大连通子图。
两点强连通:在有向图G中,如果两点互相可达
强连通图: 如果有向图G的每两个顶点都强连通(任意两点互相可达),称G是一个 强连通图 。
强连通分量: 非强连通有向图的极大强连通子图,称为强连通 分量 (strongly connected components)。
关节点(割点) :某些特定的顶点对于保持图或连通分支的连通性有特殊的重要意义。如果 移除某个顶点 将使图或者分支 失去连通性 ,则称该顶点为 关节点 。(在某图中,若删除顶点V以及V相关的边后,图的一个连通分量分割为两个或两个以上的连通分量,则称顶点V为该图的一个关节点)。
桥(割边) :和关节点类似,删除一条边,就产生比原图更多的连通分支的子图,这条边就称为 割边 或者 桥 。
双连通图 :在无向连通图中,如果删除该图的任何一个结点都不能改变该图的连通性,则该图为双连通的无向图。个人理解就是一个双连通图没有割点,没有桥的图。
1.2 一些有趣的图概念
这一部分属于图论的内容,基础图算法不会用到,但是我觉得挺有意思的,小记如下。【这部分我没看,照搬过来了】
同构 4 :图看起来结构不一样,但它是一样的。假定有$G_1$和$G_2$,那么你只要确认对于$G_1$中的所有的两个 相邻点 $a$和$b$,可以通过某种方式$f$映射到$G_2$,映射后的两个点$f(a)$、$f(b)$也是相邻的。换句话说,当两个简单图同构时,两个图的顶点之间保持相邻关系的一一对应。
图1-7就展示了图的同构,这里顶点个数很少判断图的同构很简单。我们可以把v1看成u1,自然我们会把u3看出v3。用数学的语言就是$f(u_1)=v_1$,$f(u_3)=v_3$。u1的另外一个连接是到u2,v1的另外一个连接是到v4,不难从相邻顶点的关系验证$f(u_2)=v_4$,$f(u_4)=v_2$。
欧拉回路(Euler Circuit) :小学数学课本上的哥尼斯堡七桥问题,能不能从镇里的某个位置出发 不重复的经过所有桥(边)并且返回出发点 。这也就小学的一笔画问题,欧拉大神解决里这个问题,开创了图论。结论很简单:至少2个顶点的连通多重图存在欧拉回路的充要条件是 每个顶点的度都是偶数 。证明也很容易,大家有兴趣可以阅读相关资料。结论也很好理解,从某个起点出发,最后要回起点,中间无论路过多少次起点,都会再次离开,进、出的数目必然相等,故一定是偶数。
哈密顿回路(Hamilton Circuit) :哈密顿回路条件就比欧拉回路严格一点, 不能重复经过点 。你可能会感到意外,对于欧拉回路,我们可以轻而易举地回答,但是 我们却很难解决哈密顿回路问题,实际上它是一个NP完全问题 。这个术语源自1857年爱尔兰数学家威廉·罗万·哈密顿爵士发明的智力题。哈密顿的智力题用到了木质十二面体(如图1-8(a)所示,十二面体有12个正五边形表面)、十二面体每个顶点上的钉子、以及细线。十二面体的20个顶点用世界上的不同城市标记。智力题要求从一个城市开始,沿十二面体的边旅行,访问其他19个城市,每个恰好一次,最终回到第一个城市。
因为作者不可能向每位读者提供带钉子和细线的木质十二面体,所以考虑了一个 等价的问题 :对图1-8(b)的图是否具有恰好经过每个顶点一次的回路?它就是对原题的解,因为这个平面图 同构 于十二面体顶点和边。
着名的 旅行商问题(TSP) 要求旅行商访问一组城市所应当选取的最短路线。这个问题可以归结为求完全图的哈密顿回路,使这个回路的边的权重和尽可能的小。同样,因为这是个NP完全问题,最直截了当的方法就检查所有可能的哈密顿回路,然后选择权重和最小的。当然这样效率几乎难以忍受,时间复杂度高达$O(n!)$。在实际应用中,我们使用的启发式搜索等 近似算法 ,可以完全求解城市数量上万的实例,并且甚至能在误差1%范围内估计上百万个城市的问题。
关于旅行商问题目前的研究进展,可以到 http://www.math.uwaterloo.ca/... 。
1.3 小结
以为可以一带而过,结果写了那么多。也没什么好总结的了,当然这些也至是图论概念的一小部分,还有一些图可能我们以后也会见到,比如顺着图到网络流,就会涉及二分图,不过都很好理解,毕竟有图。
1、数组(邻接矩阵)
2、邻接表
3、十字链表
4、邻接多种表
㈦ 经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijkstra算法)
最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。
1.Kruskal算法
此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。
Prim算法
此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。
1.图的所有顶点集合为VV;初始令集合u={s},v=V−uu={s},v=V−u;
2.在两个集合u,vu,v能够组成的边中,选择一条代价最小的边(u0,v0)(u0,v0),加入到最小生成树中,并把v0v0并入到集合u中。
3.重复上述步骤,直到最小生成树有n-1条边或者n个顶点为止。
哈夫曼树又称最优二叉树。它是 n 个带权叶子结点构成的所有二叉树中,带权路径长度 WPL 最小的二叉树。
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:
(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
注意:为了使得到的哈夫曼树的结构尽量唯一,通常规定生成的哈夫曼树中每个结点的左子树根结点的权小于等于右子树根结点的权。
在电报通信中,电文是以二进制的0、1序列传送的,每个字符对应一个二进制编码,为了缩短电文的总长度,采用不等长编码方式,构造哈夫曼树,
将每个字符的出现频率作为字符结点的权值赋予叶子结点,每个分支结点的左右分支分别用0和1编码,从树根结点到每个叶子结点的路径上
所经分支的0、1编码序列等于该叶子结点的二进制编码。如上文所示的哈夫曼编码如下:
最短路径问题介绍
问题解释:
从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径。
初始状态:S是已计算出最短路径的顶点集合,U是未计算除最短路径的顶点的集合!
第1步:将顶点D加入到S中。
此时,S={D(0)}, U={A(∞),B(∞),C(3),E(4),F(∞),G(∞)}。 注:C(3)表示C到起点D的距离是3。
第2步:将顶点C加入到S中。
上一步操作之后,U中顶点C到起点D的距离最短;因此,将C加入到S中,同时更新U中顶点的距离。以顶点F为例,之前F到D的距离为∞;但是将C加入到S之后,F到D的距离为9=(F,C)+(C,D)。
此时,S={D(0),C(3)}, U={A(∞),B(23),E(4),F(9),G(∞)}。
第3步:将顶点E加入到S中。
上一步操作之后,U中顶点E到起点D的距离最短;因此,将E加入到S中,同时更新U中顶点的距离。还是以顶点F为例,之前F到D的距离为9;但是将E加入到S之后,F到D的距离为6=(F,E)+(E,D)。
此时,S={D(0),C(3),E(4)}, U={A(∞),B(23),F(6),G(12)}。
第4步:将顶点F加入到S中。
此时,S={D(0),C(3),E(4),F(6)}, U={A(22),B(13),G(12)}。
第5步:将顶点G加入到S中。
此时,S={D(0),C(3),E(4),F(6),G(12)}, U={A(22),B(13)}。
第6步:将顶点B加入到S中。
此时,S={D(0),C(3),E(4),F(6),G(12),B(13)}, U={A(22)}。
第7步:将顶点A加入到S中。
此时,S={D(0),C(3),E(4),F(6),G(12),B(13),A(22)}。
此时,起点D到各个顶点的最短距离就计算出来了:A(22) B(13) C(3) D(0) E(4) F(6) G(12)。
㈧ 机器学习算法和图论算法有什么不同
机器学习算法和图论算法有什么不同
或者,算法是怎么分类的?首先想到的,处理的数据量上的不同。比如传统的一个道路规划问题,涉及到的对象在百数量级上是很正常的现象,而现在数据产生的速度太快了,数据太多了,对于一个网络优化问题可能涉及的对象是几个亿,比如facebook。但是这还是不能回答我最开始的问题,即便是百万,十万对象的网络,比如约会网站吧,在这个数量级差不多,它会涉及到推荐算法,推荐的方法的话是用概率模型去做的,可以用机器学习的方法学习出一些结果;那么对一个同量级的对象,会需要一个图论算法去做解决什么问题吗?个人觉得机器学习主要在于解决问题的思路不同,态度更开放,我晓得的一些图论算法就是针对一个对于全局有了很稳定认识的解决方法,而比如一个线上的机器学习算法,它的预测结果直接影响新数据的产生。基本上这样的方法是可靠的,对于任意一个全局的算法,可以用开放的眼光看它,即用机器学习的方法适用它将它应用到新的有大量数据支持的适宜的问题中的。
这个时代的困难在于,我们不能用自己大脑在一瞬间可以理解的范围之内全面的理解一个问题,我们把大家的大脑都连起来了,我们也需要更强大的工具理解前所未有的问题。比如,从远古,理解若干个事件交织的复杂的问题是有困难的,我们利用文氏图清晰地显示多于4、5个事件之间的逻辑关联。现在是几十亿人,不知多少事件的关联,利用文氏图都不够了,但是我们总是可以找到合适的切入点提纲契领的理解总体的事物,我们的工具变成了高等数学,可靠的矩阵运算。所以,我自己倾向于将机器学习看成可靠地帮助我们理解新事物的方法,它使用的工具来自我们可靠的数学观点。
所以,机器学习的想法最重要,可以从任何一种现有的可靠的观点指导下,拓展我们理解世界的方式。我想把它解释为一种群体智慧的形成机制,为什么是群体智慧,我做为个人不需要识别一万张脸与他们的名字对应,但是做为一个公司却有需要在一秒钟之内认出自己的客户并且向他问好,提供服务。也就是说,我们生活的时代群体智慧起不可估量的作用,向四周一看你就明白你所用物品大部分不是来自认识和亲近的人。其实也是观念的成长,中国很长一段时间的小农经济自给自足,如果你吃的竟然是别人种的粮食,穿是别人织布剪裁,这在当时会是让你很不适应的。这个如今排斥Google的街景车来保卫自己的隐私这有啥差别呢?再到离我们更近一点的历史,更多的是群体智慧具象化的产品的传播,而如今呢更直接的就是群体智慧的传播。
机器学习背后的Philosophy应该是这样一种开放的面向未来的态度,我自己挺认同,也希望能把群体智慧开掘出来,产生前所未有商业价值。
㈨ 运筹学中的图论问题
很多实际的生产问题都能被抽象成一张大的图。具体一点的例子,比如需要在若干个城市之间铺设铁路或者架设电网,那么城市就是图里面的点,铁路电网就是图里面的边。抽象一点的例子,比如完成一个项目的过程中所有可能出现的状态都可以视为一个点,而状态到状态之间的转换就是边。上一篇文章中我们说过运筹学是处理实际生产生活中遇到的问题的。一旦实际问题被抽象成了一个图的模型(注意与机器学习里面的图模型区分开来),很多图论里面的算法就可以用来解决实际问题,所以图论是运筹学当中的一个很大的分支。今天我们就介绍一下几个图论的基本算法及其在生产生活中的应用。
一最小生成树
比如现在要在若干个村子之间架设电网,保证每个城市都通上电(先不考虑电网输电能力大小)。虽然理论上讲,任何两个村子之间都可以架设电线,不过那样的话成本很到,不划算,我们需要在所有可能的连线里面找到一组总长最短的边,保证这些边把每个村子都连上了。在图论中,这是一个典型的最小生成树问题。有两种解决最小生成树的方法,第一种办法是把所有的边按照从小到大的顺序添加到图里面,如果产生回路就舍弃它,直到覆盖了所有的点。另一种方法是把图上的边按照从大到小的顺序删除,直到再删下去就一定会产生离散的点为止。
二最短路径
图论中应用最广的问题可能就是最短路径问题了。地图上很多城市之间都有道路相连,想从一个城市到另一个城市,往往有多种选择,可是走那条路距离最短呢?如果地图规模不大,我们可以一眼就看出来。可是随着地图规模变大,就很难再一眼看出来了,需要有严格的算法保证找到最短路径。目前已经有了很多种最短路径算法,他们的基本思想也不尽相同。以着名的Dijkstra算法为例,它每次会选择距离“所有已经选择过了的点”中距离最近的下一个点,一步步的迭代下去。这个流程保证了算法会按照距离出发点由近到远的顺序选择每一个点。
三最大流-最小割问题
油气输送网络又许多不同的边组成,每一条边的运输能力有限。输送油气资源的时候,为了最大化运输量,需要合理安排通过每一条边的油气流量。这就是在一个网络寻找最大流的问题(等价于寻找最小割)。解决问题的想法很简单,找到一组边,它们把整个网络分成了两部分,流的源和目的地址分属于这两个部分。我们称这样一组边为图的一个分割。由于所有的油气流都要通过分割中的边,所以最大流其实受制于分割的流通能力的。于是最大流应该等于流通能力最小的分割。剩下的问题,就是一步步调整,找到最小分割了。