- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
学课件课件PPT医学培训课件教育资源教材讲义
算法实现如下: /***************************************************/ /* 单源最短路径算法 文件名:dijkstra.c */ /* 函数名:spath_dij() 、 print_gpd() */ /***************************************************/ #include c_ljjz.c /*引入邻接矩阵创建程序*/ typedef enum{FALSE,TRUE} boolean; /*false为0,true为1*/ typedef int dist[m]; /* 距离向量类型*/ typedef int path[m]; /* 路径向量类型*/ void spath_dij(mgraph g,int v0,path p,dist d) { boolean final[m]; int i,k,j,v,min,x; 8.5生成树与最小生成树 对于一个无向的连通图G=(V,E),设G是它的一个子图,如果G中包含了G中所有的顶点(即V(G)=V(G))且G是无回路的连通图,则称G为G一棵的生成树。 深度优先生成树:按深度优先遍历生成的生成树 广度优先生成树:按广度优先遍历生成的生成树 c0 c1 c3 c2 c4 c5 c0 c1 c3 c2 c4 c5 有向图的生成树 c0 c1 c3 c2 c4 c5 c6 c0 c1 c3 c2 c4 c5 c6 c0 c1 c3 c2 c4 c5 c6 (a)以c0为根的有向图 (b)DFS生成树 (c)BFS生成树 非连通图的生成森林 V0 V1 V3 V4 V2 V6 V8 V7 V5 V9 V0 V1 V3 V4 V2 V6 V8 V7 V5 V9 V0 V1 V3 V4 V2 V8 V7 V9 V6 V5 (a)不连通的无向图G12 (b)图G12的一个DFS生成森林 (c)图G12的一个BFS生成森林 8.5.1最小生成树的定义 若有一个连通的无向图 G ,有 n 个顶点,并且它的边是有权值的。在 G 上构造生成树 G’ , 使这n-1 条边的权值之和在所有的生成树中最小 。 例 ? 要在 n 个城市间建立交通网,要考虑的问题如何在保证 n 点连通的前题下最节省经费? A B C D E F 10 10 15 12 12 8 7 6 6 5 上述问题即要使得生成树各边权值之各最小,即: 构造最小生成树的准则: 必须只使用该网络中的边来构造最小生成树; 必须使用且仅使用n-1条边来联接网络中的n个顶点; 不能使用产生回路的边。 假设G=(V,E)是一个连通网,U是顶点集V的一个非空真子集,若(u,v)是满足u?U,v?V-U的边(称这种边为两栖边)且(u,v)在所有的两栖边中具有最小的权值(此时,称(u,v)为最小两栖边),则必存在一棵包含边(u,v)的最小生成树。 MST性质: 证明: u v v’ u’ U V-U 设(u,v)是连接U与(V-U)之间所有边中的最小代价边(最小两栖边)。反证时假设G中的任何一棵最小生成树都不含此最小两栖边。设T是连通网上的一棵最小生成树,当将(u,v)加入到T中时,由生成树的定义,T中必存在一条包含(u,v)的回路。另一方面,由于T是生成树,则在T上必存在另一条边(u’,v’),其中u’ ? U,v’ ? V- U,且u和u’之间,v和v’之间均有路径相通,删去边(u’,v’),便可消除上述回路,同时得到另一棵生成树T’。因为(u,v)的代价不高于(u’,v’),则T’的代价亦不高于T,T’是包含(u,v)的一棵最小生成树。由此和假设矛盾。 普里姆算法的基本思想: 8.5.2最小生成树的普里姆算法 (Prim)算法和(Kruskal)算法是两个利用MST性质构造最小生成树的算法。 从连通网络 G = { V, E }中的某一顶点 u0 出发,选择与它关联的具有最小权值的边(u0, v),将其顶点加入到生成树的顶点集合U中。 以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v),把它的顶点加入到集合U中。如此继续下去,直到网络中的所有顶点都加入到生成树顶点集合U中为止。 Prim算法的基本步骤如下: (1)初始化:U={u0},TREE={}; (2)如果U=V(G),则输出最小生成树T,并结束算法; (3)在所有两栖边中找一条权最小的边(u,v)(若候选两栖边中的最小边不止一条,可任选其中的一
原创力文档


文档评论(0)