图论专题选讲概要.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图论专题选讲 by acerlawson A - 秋实大哥与连锁快餐店 题目大意:二维平面上有n个点,部分点是特殊点,添加长度和最小的边,使得任意一点都能至少能和一个特殊点连通。 首先,先解决一个子问题: n个点的完全图中,有m n n-1 /2条边,求最小生成树。 对于完全图: prim算法:时间复杂度O n^2 ,空间复杂度O n . Kruskal算法:时间复杂度O mlogm ,空间复杂度O m . 在解决完全图的最小生成树中,prim更优。 A - 秋实大哥与连锁快餐店 题目大意:二维平面上有n个点,部分点是特殊点,添加长度和最小的边,使得任意一点都能至少能和一个特殊点连通。 接下来,再考虑第二个子问题: 二维平面上的n个点,添加长度和最小的边,使得整体联通。 其实就是第一个子问题的变形,n个点的完全图,任意两个点的边权定义为这两个点之间的欧几里德距离,求最小生成树。 A - 秋实大哥与连锁快餐店 题目大意:二维平面上有n个点,部分点是特殊点,添加长度和最小的边,使得任意一点都能至少能和一个特殊点连通。 最后,我们回到原题,可以发现第二个问题和原题的区别只是特殊点的存在与否。那么如何解决特殊点呢? 很简单啊! 特殊点之间的边权变为0就解决了! A - 秋实大哥与连锁快餐店 题目大意:二维平面上有n个点,部分点是特殊点,添加长度和最小的边,使得任意一点都能至少能和一个特殊点连通。 如何实现? 方法1.在更新边权的时候: 如果两个点都是特殊点,d vi,vj 0; 否则,d vi,vj 欧几里德距离; 方法2.先把特殊点处理了,再把普通点处理了。 B - 秋实大哥带我飞 题目大意:非负权无向图中最短路方案数。 (无关紧要的题意补充:保证起点到终点一定可达。 题目来源:Topcoder srm div1 B 首先,最简单的,求起点到每个点i的最短路dist[i]。 Dijkstra,spfa什么的随便选一个乱搞一下就行了。 B - 秋实大哥带我飞 题目大意:非负权无向图中最短路方案数。 接下来是重点,求方案数。 首先我们总需要知道最短路可以经过哪些点吧? 我们可以倒着从终点往回走,通过一个普通的队列来实现。 先把终点t扔进空队列,每次那一个点i拿出来。 对于点i的所有边edge i,j ,如果前驱dist[j] edge i,j +dist[i],那么就可认为:一定能通过j点到达i的最短路dist[i],同时把j点也加进队列 。直到队列为空为止。 B - 秋实大哥带我飞 题目大意:非负权无向图中最短路方案数。 B - 秋实大哥带我飞 题目大意:非负权无向图中最短路方案数。 这样就能知道所有最短路径中经过的所有可能点有哪些了。 然而看上去对求方案数并没有什么卵用。 其实只要在过程中稍稍修改,就可以求出答案了。 B - 秋实大哥带我飞 题目大意:非负权无向图中最短路方案数。 对于每个点i,定义两个值ans[i]和ways[i]。 ans[i]表示从这个点i到终点最短路的总方案数。 ways[i],表示从这点i到终点最短路中还有ways[i]的方案数没有分配给前驱j点(满足dist[j] edge i,j +dist[i]的点) B - 秋实大哥带我飞 题目大意:非负权无向图中最短路方案数。 具体实现过程: 每次从队列中拿队首元素u出来: 遍历所有与它相邻的边e 如果dist[e.v] dist[u]+e.d,那么分配给v:ways[e.v]+ ways[u] 遍历完边以后,把ways[u]分配给自己:ans[u]+ ways[u]。 这样ways[u]就被分配完了,置0。 B - 秋实大哥带我飞 题目大意:非负权无向图中最短路方案数。 ways ans ways ans ways ans ways ans B - 秋实大哥带我飞 题目大意:非负权无向图中最短路方案数。 接下来是细节问题: 重边:没影响啊! 0边:从终点往回走的过程中只要遇到0边答案就是无数条啊! 算法:Spfa的思想求方案数! 也可以用其他方法乱搞:拓扑排序、dfs之类等等。 C - 秋实大哥与时空漫游 给定初始的时间St和地点Sp,现在要求求出一组合法路径使得,能够在Tt时间之前到达Pt。 每一条边(传送门)定义: 起点a,终点b,起始时间c,终点时间d。如果想走这条边,那么就必须在c时刻之前到达a,等候到c时刻的时候通过该边到达b点的d时间。 题意很复杂?没有头绪? 其实很简单! C - 秋实大哥与时空漫游 首先,每条边走一次就够了。走两次反而会致使一个星球上同时存在两个秋实大哥。 接下来,我们定义对每个点定义数组tim[i]表示目前为止最早能到i点的时刻。

文档评论(0)

我是追梦人 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档