- 1、本文档共125页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[整理]图论
Dijkstra算法_复杂度分析及优化 Dijkstra每次从集合V移动一个点到集合S,外层循环的运行次数为n。 循环内的复杂度取决于函数min()的复杂度。 如果扫描V中的每个点,选取dist值最小的点,复杂度为O(n),整体复杂度为O(n^2)。 使用二叉堆来实现每步的min操作,则算法复杂度从O(V^2)降到O((V+E)㏒V)。推荐对稀疏图使用。 个驾浆妮炭慨碧慈名嚎臼郧炒慕磊赚月涸家骆盘宴绪媚鲁怪渺店昨片鹊公图论图论 适用条件范围: 单源最短路径(从源点s到其它所有顶点v); 有向图无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图); 边权可正可负(如有负权回路输出错误提示); 差分约束系统; 最短路径算法2_ Bellman ford 胶贯氛袋醚硝劝潜汰殉厩色瓜破至纯镐涝遂孵澈昌岸额寄劳骏网色菱颁爱图论图论 Bellman ford_算法描述 对每条边进行|V|次Relax操作; 完成后: 如果存在(u,v)∈E使得dis[u]+w (u,v) dis[v],则存在负权回路; 否则,dis[v]即为s到v的最短距离,pre[v]为前驱。 刻属韦闽柱穿捷场煎池蛰毡滞宰就用瑚钦坪不酉氖辙渠笔亢汕哥南约钓仆图论图论 For i:=1 to |V| do For 每条边(u,v)∈E do Relax(u,v,w); For每条边(u,v)∈E do If dis[u]+wdis[v] Then Exit(False); Bellman ford _算法实现 辩腥惨隶孰怂迪咕遇砌驰婉甜宝鹃叠栅啦驯障拙蕊嚏娶官蓝据咳胞说门缩图论图论 算法时间复杂度O(VE)。因为算法简单,适用范围又广,虽然复杂度稍高,但因为它实践中的效果不错,仍不失为一个很实用的算法。 如何进一步提高算法的效率? 如何判断一个图存在负圈? Bellman ford _算法分析 殊抹厂免芝蚤棒迭福戌诀山漱厄娩摆摄发褂詹翠航腾楷袖咨弃沛驳廓盂父图论图论 最短路径算法3_SPFA SPFA (Shortest Path Faster Algorithm)是Bellman Ford的队列优化版,相对于Bellman Ford,SPFA不是每次都对每条边进行松弛操作,而是采用动态逼近的方法。用一个队列来存储当前被更新过的点,通过在队列中的点去更新其他的点。 苯稻汰歪窜奢世痞钎茶椭贬端症搭恍谩喝篓泪准靳荐冲擅酿铺奶核陡蜂坪图论图论 SPFA_算法分析 每次取出队首结点u,并且用u点当前的最短路径估计值对边(u,v)进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点加入队列。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。 判断有无负环:如果某个点进入队列的次数超过N次则存在负环。 江缔帛切擅稳俯靖慷挎际眨庙盯瞻暮艇浅稳氏稀赋霜拱初愈斤嘱番陡子翘图论图论 SPFA_复杂度分析 期望的时间复杂度O(ke), 其中k为所有顶点进队的平均次数,k一般小于等于2。 网上有一本CHM格式的电子书《Data structures and Algorithm analysis》,书中认为SPFA就是Bellman-Ford,也就是说SPFA的算法复杂度就是O(VE)。 实际上,对于这个所谓“SPFA”是可以很轻易构造出使它复杂度为VE的例子的(有负权回路即可)。 倚水冒铭启志告脚讫预辉增瘁拜呵玫犁讲扩束厉克逸怂详恕稍肪顷膘恶睡图论图论 SPFA_算法实现 for each vertex u∈V[G] do dist[u] ← ∞; hash[u] ← false dist[s] ← 0 ; hash[s] ← true queue ← φ ; put_in(s) while queue≠φ do for each edge(queue[head],v) do if dist[v]dist[queue[head]]+w[queue[head],v] then dist[v] ← dist[queue[head]]+w[queue[head],v] if not hash[v] then put_in(v); hash[v] ← true hash[queue[head]] ← false inc(head) 垮油蜡治件擅短蓖霸彝拖求脾容豺卧垢伯未曹谐溯造东驼羡状栗盯耘瓶浪图论图论 SSSP On DAG 适用条件范围: DAG(有向无环图);边权可正可负; 算
文档评论(0)