贪心算法(图算法)ppt课件.ppt
《贪心算法(图算法)ppt课件.ppt》由会员分享,可在线阅读,更多相关《贪心算法(图算法)ppt课件.ppt(48页珍藏版)》请在三一办公上搜索。
1、Algorithms,贪心算法之图算法,刘 伟(Sunny)weiliu_,内容,最小生成树单源最短路径,思考,若要将n个城市之间原有的公路改造为高速公路,这些城市之间原有公路网如右图所示。如何以最低的成本来构建高速公路网,使得任意两个城市之间都有高速公路相连?,最小生成树,最小生成树,最小生成树,Minimal Spanning Trees(MST)任何只由G的边构成,并包含G的所有顶点的树称为G的生成树(G连通)。加权无向图G的生成树的代价是该生成树的所有边的代价(权)的和,最小代价生成树是其所有生成树中代价最小的生成树。,最小生成树,Prim算法:时间复杂度O(|V|2+|E|),O(|
2、E|log|V|)Kruskal算法:时间复杂度O(|E|log|E|)算法的选择:从图的稀疏程度考虑(稠密图Prim,稀疏图Kruskal或Prim+Heap),最小生成树,Prim算法(1)任意选定一点s,设集合S=s(2)从不在集合S的点中选出一个点j使得其与S内的某点i的距离最短,则(i,j)就是生成树上的一条边,同时将j点加入S(3)转到(2)继续进行,直至所有点都己加入S集合,最小生成树,Prim算法,5,0,4,6,1,3,2,10,25,14,24,22,16,18,5,0,4,6,1,2,10,25,14,22,16,12,3,12,28,最小生成树,Prim算法练习:公路造
3、价现有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权代表公路造价。在分析了这张图后发现,任一对城市都是连通的。现在要求用公路把所有城市联系起来,如何设计可使得工程的总造价最少?,最小生成树,Prim算法练习:公路造价【输入格式】第一行两个数v(v=200)和e分别代表城市数和边数,以下e行,每行为两个顶点和它们之间的边权w(w1000)。【输出格式】v-1行,每行为两个城市的序号,表明这两个城市间建一条公路,再加该公路的造价。,最小生成树,Prim算法练习:公路造价【输入样例】【输出样例】,3 31 2 101 3 152 3 50,1 2 101 3 15,最小生成
4、树,Prim算法练习:公路造价,最小生成树,思考在某个城市里住着n个人,现在给定关于这n个人的m条信息(即某2个人认识)。假设所有认识的人一定属于同一个单位,请计算该城市最多有多少单位?,最小生成树,并查集Union-Find Set一种树型数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题在使用中常常以森林来表示可以把图中每个连通分量看成一个集合,该集合包含了连通分量中的所有点,图的所有连通分量可以用若干个不相交的集合来表示,最小生成树,并查集将编号分别为1N的N个对象划分为不相交集合,在每个集合中,选择其中某个元素代表所在集合常见操作:合并两个集合查找某元素属于
5、哪个集合判断两个元素是否属于同一个集合,最小生成树,并查集三个基本操作make_set(x):把每一个元素初始化为一个集合find_set(x):查找一个元素所在的集合。在执行查找操作时,要沿着父结点指针一直找下去,直到找到树根为止判断两个元素是否属于同一集合,只要判断它们所在集合的祖先是否相同即可合并两个集合,也是将一个集合的祖先作为另一个集合的祖先union_set(x,y):利用find_set()找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先,最小生成树,并查集通过使用两种启发式策略(按秩合并和路径压缩)可以达到渐进意义上最快的不相交集合数据结构秩(Rank):表示结点高
6、度的一个上界,树根的秩为0union_set(x,y)时按秩合并,合并的时候将元素少的集合合并到元素多的集合中,这样合并之后树的高度会相对较小,即每个元素的秩相对较小find_set(x)时路径压缩,当经过递推找到祖先结点后,回溯的时候顺便将它的子孙结点都直接指向祖先,这样以后再次find_set(x)时复杂度就变成O(1)了,最小生成树,并查集标准代码,#include const int MAXN=100;/*结点数目上线*/int paMAXN;/*px表示x的父结点*/int rankMAXN;/*rankx是x的高度的一个上界*/*创建一个单元集*/void make_set(int
7、 x)pax=x;rankx=0;/*带路径压缩的查找*/int find_set(int x)if(x!=pax)pax=find_set(px);/将所有结点的父结点回溯为根结点 return pax;,/*按秩合并x,y所在的集合*/void union_set(int x,int y)x=find_set(x);/返回x的根结点 y=find_set(y);/返回y的根结点 if(rankx ranky)/*让rank比较高的作为父结点*/pay=x;else pax=y;if(rankx=ranky)ranky+;,最小生成树,并查集练习:无所不在的宗教世界上宗教何其多。假设你对自己
8、学校的学生总共有多少种宗教信仰很感兴趣。学校有n个学生,但是你不能直接问学生的信仰,不然他会感到很不舒服的。有另外一个方法是问m对同学,是否信仰同一宗教。根据这些数据,相信聪明的你是能够计算学校最多有多少种宗教信仰的。,最小生成树,并查集练习:无所不在的宗教【输入格式】可以输入多个测试用例(Case),每一个用例的第一行包含整数n和m,n表示学生编号(1-n),在接下来的m行中,每一行包含两个整数,对应信仰同一宗教的两名学生的编号,输入结束行为n=m=0。【输出格式】输出每一个测试用例中包含的学生信仰的最大宗教数量。,最小生成树,并查集练习:无所不在的宗教【输入样例】【输出样例】,10 91
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪心 算法 ppt 课件

链接地址:https://www.31ppt.com/p-2134638.html