转跳到内容

每 日 算 法 挑 战 【第D期】


只显示该作者

只有该作者的内容显示中。 返回到主题

推荐贴

:mx040:是图论问题

 

对问题数学建模

剧透

 

先从最简单的情况入手好了,已知(二维平面上)一堆点与点之间的距离,选择一组(无向)边使得任意两点间存在路径,且代价最小,所得结构为最小生成树 —— 引理1

首先可以证明最小生成树满足任意两点间有路径,需要证明该结构保证权重最小

假设有n个点,则无论怎么选,如果少于n-1条边,必然存在至少一组点之间没有路径

反之大于n-1条边,必然存在一条多余的边可以丢掉(因为构成了环)

因此只需要考虑n-1条边情况,根据最小生成树定义的最小,成立。

 

接下来就是开始考虑题目中的骚扰问题了

因为骚扰,所以某一条边的代价增加了,这时候我们需要找到新的最小生成树

 

因此整道题可以数学地表述为:

已知图 G = (V, E),与(非负)权重w,现有一条边e 的权重增加从 w(e) 变为 w(e) + dw,如何快速求新的最小生成树

 

 

暴力的不能更暴力的方法

剧透

 

显然最暴力的方案是直接把e的权重换了,然后在新的权重上重跑一次最小生成树的算法就完了,所以用Prim花费O(n^2)带走就好了

注:Kruskal复杂度是O(m log m),根据题意是完全图,m = O(n^2),所以还是直接用Prim快一些

 

 

一些优化方法的想法

剧透

 

当然显然我们其实可以不必这么暴力

假如我们在原图上已经求到了最小生成树,因为只增加了一条边的权重,所以我们可以具体情况具体分析

1. 如果这条边本身就不在原来的最小生成树里面,那……?

2. 如果这条边在原来的最小生成树里面,但是只增加了0.0000000000000000001的权重,那……?

3. 考虑与上面这条相反的情况,假如这条边加了无限多的权重,你就当这条路了被毁了,这个情况下要如何做? (注:最坏情况下可能并不会比暴力的速度更快)

 

感觉没人继续挑战,那我写完吧

剧透

 

显然情况1的情况下,我们本来就不要这条边,那自然现在代价更大了我们更不要了,所以最小生成树不变

而在我们需要用这条边的情况下,丢掉这条边我们会得到2个不联通的树,接下来只要我们在其中连一条边即可完成,显然应该选择其中最小的边。如果增加权重的这条边位置比较好,形成一侧比较少的节点(极端情况只有1个点),那我们只需要O(n)的时间比较所有连接到这侧的边的权重即可。但是如果脸不是很好,最坏情况下得到了两个n/2的树,那么我们不得不花费 n^2 / 4 = O(n^2)的时间比较之间的所有边,还是比较疼的。

 

 

 

更有趣的一些情况

剧透

 

假设现在战争情况好转,敌军开始撤退。具体来说,现在某一条路上的游击队减少了,因此我们可以减少这条路的守卫,这个情况下,怎么做最好?

即,与题目情况相反,不是增加某一条路的权重而是减少某一条路的权重,这时候最小生成树要怎么找

 

解答

剧透

 

类似的,如果降低了一条本来就在最小生成树的边的权重,那么再好不过了,最小生成树不变。

反之如果降低了一条树外的边,那么考虑把这条边加入树,则必然构成一个环。接下来只需要在这个环上把最重的边再丢出去即可,这个情况下最坏只需要O(n)的时间,实际上是比增加权重的情况要简单的

 

 

 

,由yhz012修改
链接到点评
刚刚, Mr.K 018 说道:

考虑一个想法:决定弃用一个已使用的道路,无非是将原有的最小生成树砍成两半,找一条边接上即可

实际上就是这样,最坏还是O(n^2),不过常数项来说还是比暴力重做要好多了

yhz012遇见阿里尼,决定跟着他学打游戏,买游戏被G胖骗走了 -2节操

链接到点评
×
×
  • 新建...

重要消息

为使您更好地使用该站点,请仔细阅读以下内容: 使用条款