- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 1、最小生成树性质 用贪心算法设计策略可以设计出构造最小生成树的有效算法。本节介绍的构造最小生成树的Prim算法和Kruskal算法都可以看作是应用贪心算法设计策略的例子。尽管这2个算法做贪心选择的方式不同,它们都利用了下面的最小生成树性质: 设G=(V,E)是连通带权图,U是V的真子集。如果(u,v)?E,且u?U,v?V-U,且在所有这样的边中,(u,v)的权c[u][v]最小,那么一定存在G的一棵最小生成树,它以(u,v)为其中一条边。这个性质有时也称为MST性质。 * 2、Prim算法 设G=(V,E)是连通带权图,V={1,2,…,n}。 构造G的最小生成树的Prim算法的基本思想是:首先置S={1},然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件i?S,j?V-S,且c[i][j]最小的边,将顶点j添加到S中。这个过程一直进行到S=V时为止。 在这个过程中选取到的所有边恰好构成G的一棵最小生成树。 思考?Prim算法和dijkstra算法的共通性? * 利用最小生成树性质和数学归纳法容易证明,上述算法中的边集合T始终包含G的某棵最小生成树中的边。因此,在算法结束时,T中的所有边构成G的一棵最小生成树。 例如,对于右图中的带权图,按Prim算法选取边的过程如下页图所示。 * * 3、Kruskal算法 Kruskal算法构造G的最小生成树的基本思想是,首先将G的n个顶点看成n个孤立的连通分支。将所有的边按权从小到大排序。然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支:当查看到第k条边(v,w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v,w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边;如果端点v和w在当前的同一个连通分支中,就直接再查看第k+1条边。这个过程一直进行到只剩下一个连通分支时为止。 * 例如,对前面的连通带权图,按Kruskal算法顺序得到的最小生成树上的边如下图所示。 例题3.POJ2784 题目大意:有n个城市,初始有些城市之间已经连通,最多只有8个城市集合连通,你可以选择一些集合,但 要花费一定得费用。同时连接任意两个城市也要花费一定的费用,问最后连通n个城市的最小费用。 Sample Input 7 3 2 4 1 2 3 3 3 6 7 3 9 2 4 5 0 2 4 0 2 0 4 2 1 3 0 5 4 4 Sample Output 14 * 思考?如何解决? 由于只有8个城市集合,因此我们可以枚举所有的购买情况,一共是2^8=256。每一次都求一遍最小生成树,去最小的即可。 问题的关键是我们怎么去求这颗最小生成树? 如果256次prim,那么复杂度是256*n^2,这个显然太高了。考虑kruskal,一次排序后那么每次求生成树的复杂度平摊下来可以到o(n)。 思考?在不同的情况下如果有效的选择两种算法来获取最好的效果? 3.图论中的圈和块 SCC的概念 有向图中, u可达v不一定意味着v可达u. 相互可达则属于同一个强连通分量(Strongly Connected Component, SCC) 有向图和它的转置的强连通分量相同 所有SCC构成一个DAG 一、Kosaraju算法 算法步骤 调用DFS(G), 计算出每个结点的f[u] 计算GT 调用DFS(GT), 在主循环中按照f[u]递减的顺序执行DFS-VISIT, 则得到的每个DFS树恰好对应于一个SCC 运行时间:O(n+m) 算法示例: 先把f[u]排序成postI数组, 然而在GT上DFS 当按照f值排序以后, 第二次DFS是按照SCC的拓扑顺序进行(以后所指d[u]和f[u]都是第一次DFS所得到的值) 记d(C)和f(C)分别表示集合C所有元素的最早发现时间和最晚完成时间, 有如下定理: 定理: 对于两个SCC C和C’, 如果C到C’有边, 则f(C)f(C’) 情况一: d(C) d(C’), 考虑C中第一个被发现的点x, 则C’全为白色, 而C到C’有边, 故x到C’中每个点都有白色路径. 这样, C和C’全是x的后代, 因此f(C) f(C’) 情况二: d(C) d(C’). 由于从C’不可到达C, 因此必须等C’全部访问完毕才能访问C. 因此f(C) f(C’) 推论:对于两个SCC C和C’, 如果在GT中C到C’有边, 则f(C)f(C’) Kosaraju算法的正确性 首先考虑f(C)最大的强连通分量. 显然, 此次DFS将访问C的所有点, 问题是是否可能访问其他连通分量的点? 答案是
文档评论(0)