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