给出具有N个顶点和M个边的图G,其中N <= 10 ^ 4且M <= 10 ^ 5。现在,您必须向图中添加一条边(u,v),以便最小化桥的总数。 G可能有多个边,但没有自循环。另一方面,在添加边缘G&#39;之后,新生成的图形可以具有自循环和多个边缘。如果有许多这样的(u,v),其中u <= v,则输出按字典顺序排列的最小值(顶点从1..n开始编号)。
一个简单的想法是按顺序尝试所有边,然后使用网桥查找算法来查找桥的数量。这需要时间O(V ^ 2 * E),所以它显然是无用的。如何在运行时方面做得更好?
编辑:根据j_random_hacker的建议,我添加了有关上述问题来源的以下详细信息。这是来自印度IOI训练营&#39; 14实践测试(测试3)的计算机网络(特别是问题3)的问题。这是一个现场离线测试,所以我不能通过提供链接来证明它不是来自现在的比赛。但我有问题陈述的PDF。
答案 0 :(得分:2)
这不是一个完整的答案,而是一些引导你走向它的想法:
为了避免在尝试每个可能的边缘后运行桥接查找算法,可以问:通过添加单个边缘(u,v)多少可以改变图形G中的桥梁数量?
我们看到上面的2.1是唯一一个添加边(u,v)有用的情况。此外,似乎我们可以在G中的单个路径中找到更多的桥,我们可以通过选择连接该路径的端点来中和它们。
所以看起来像#34;在G中找到包含最多桥梁的路径&#34;可能是正确的标准。但首先我们需要问自己:路径P中的桥数是否通过从P的开始到结尾添加边缘来准确计算消除的桥的数量? (我们知道添加这样的边缘必须消除至少那些桥梁,但也许其他一些也被消除作为&#34;副作用&#34; - 如果是这样,那么我们需要以某种方式计算它们以确保我们添加消除大多数桥梁的边缘。)
令人高兴的是,答案是没有其他桥梁被淘汰。这次我自己做证明。
假设存在从u到v的路径P,并且相反地假设添加边(u,v)将消除不在P上的桥(x,y)。那么它必须是单边(x,y)是从x到y的唯一路径,并且添加(u,v)将从x创建第二条路径Q,通过任一方向的边(u,v)到y,避免了edge(x,y)。但是对于任何这样的Q,我们可以用路径P替换Q中的边(u,v),从我们的初始假设中避免(x,y),并且仍然得到路径Q&#39;从x到y避免边缘(x,y) - 这意味着(x,y)必须已经通过两条边缘不相交的路径连接(即单边(x,y)和Q&#39;) ,所以它首先不可能是一座桥梁。由于这是一个矛盾,因此没有这样的&#34;作为副作用被删除&#34;桥(x,y)可以存在。
所以&#34;在G中找到包含最多桥梁的路径,并在其端点之间添加边缘&#34;肯定会给出正确的答案 - 但仍然存在一个问题:这听起来很像“最长路径”问题,对于一般图形来说这是NP难的,因此解决起来很慢。
然而,还有一条出路。 (必须有:你已经有了一个O(V ^ 2 * E)算法,所以不能解决你的问题是NP难的:-))将输入图G中的双连通组件想象为另一个图G&#39;中的顶点。这些顶点之间的边(G&#39;)对应于G?他们有任何特定的结构吗?最后(大)提示:什么是关键路径?
答案 1 :(得分:2)
这个答案是一个扰流板。您应该考虑使用j_random_hacker的答案。
如果我理解你的问题:
将图形视为biconnected components的树。找到此树中最长的路径,并将其末端与新边连接起来。
有一种线性时间算法,用于使用深度优先搜索来查找双连通分量。在树中寻找最长的路径需要线性时间,并且可以使用深度优先搜索来完成 - 使其做到&#34;找到最远的顶点并返回它和它的距离&#34;并使用它。所以这需要整个线性时间。
(您可以将它全部滚动到一个深度优先搜索中,该搜索返回最粗糙路径中的桥边数和所述最粗糙路径中最远的顶点。)