问题:
给定 N 个节点和 M 条边的图形,边的索引范围为 1 -
你需要为M条边分配权重。权重在[1...M],并且每个数字只能出现一次。
简而言之,答案应该是[1]的置换数组...M],其中arr[i] = x表示edge[i]的权重为x。
你得到了一个由n-1条边组成的集合。R保证是图的生成树。
找到一种分配权重的方法,使R是图的最小生成树,如果有多个答案,则打印具有最小字典顺序的答案。
约束条件:
N, M <= 10^6
例子:
边缘:
3 4
1 2
2 3
1 3
1 4
R = [2, 4, 5]
Answer: 3 4 5 1 2
说明:
如果像上图一样给图赋权,那么MST就是集合R,它的字典序最小。
我对O(N^2)的看法:
因为它要求最小的字典顺序,所以我遍历边的列表,以递增的顺序分配权重。最初,w = 1。可能有三种情况:
有什么方法可以改进我的解决方案,使其可以在O(N.logN)或更少的时间内工作?
是的,有一个O(m)对数m)时间算法。
非树边e的基本循环由e和eendpoint之间的树中路径组成。给定权重,生成树是最小的当且仅当对于每个非树边e,e的基本循环中最重的边是e本身。
词典编纂目标适合于贪婪算法,其中我们找到边缘1的最无效赋值,然后边缘2给定边缘1,然后边缘3给定先前边缘,依此类推。这是核心思想:如果下一个未分配的边是非树边,则在其基本循环中将下一个数字分配给未分配的树边;,然后分配下一个数字。
在此示例中,边 3-4 是第一个,边 1-3 和 1-4 完成其基本周期。因此,我们分配 1-3 → 1 和 1-4 → 2,然后 3-4 → 3。接下来是1-2,一个树边,所以1-2→4。最后,2-3 → 5(已经分配了 1-2 和 1-3)。
为了有效地实现这一点,我们需要两个要素:一个是枚举基本循环中未赋值的边的方法,另一个是赋值的方法。我对前者的建议是存储具有收缩指定边的生成树。我们不需要任何花哨的东西;首先在某处建立生成树并运行深度优先搜索来记录父指针和深度。e的基本循环将由eendpoint的最小公共祖先的路径给出。为了进行收缩,我们添加一个布尔字段,指示父边是否收缩,然后使用不相交集合林中的路径压缩技巧。工作将是O(m log m)最坏情况,但O(m)平均情况。我认为很有可能在这里插入离线最不常见的祖先算法,从而将最坏情况降到O(m)。
至于数字分配,我们可以在线性时间内处理。对于每条边,记录导致其被指定的边的索引。最后,稳定地按此索引进行bucket排序,通过将树边缘放在非树之前来打破关系。这可以在O(m)时间内完成。
这是考试准备的一部分。我知道这和最大流量算法有关,但我很乐意给你一个提示: 设为无向连通图,为权函数,为边,。描述一种算法,该算法确定是否可以从图中最多删除边,以便属于新图的最小生成树。 我认为生成树是一种完美的匹配。但是,如何使它最小化,包含e和适当数量的其他边?
在加权无向图中,我需要找到一个包含给定边“e”的最小生成树,如果可能的话。我该怎么做呢?Kruskal从“e”开始?
设T=(V,E)是一棵顶点和边的树,代价已知。我们想构造一个最小权完备图G=(V,E'),它的唯一最小生成树是T。 示例:考虑下面的树T,红色边具有给定的代价。将添加虚线边以从这棵树构造一个完整的图。 作为其唯一MST而跨越T的最小权完备图G如下所示: 2)对MST的所有其他边,权重,按权重递减的顺序重复。进行只包括而不包括其他MST边的切割。此切割的任何未知非MST边的权重应为。 问题: 1)上
所以我有一个练习,我应该证明或反驳: 1)如果e是连通图G中的一个最小权边,使得不一定所有边都是不同的,则G的每一个最小生成树都包含e 关于如何证明这两个问题,有什么建议吗?归纳法?不知道怎么接近。
我有一个由最小生成树表示的边加权无向图。每个垂直由一个整数表示。MST如下所示: 我想知道,如何使用这个MST来找到从顶点x到顶点y的最短路径?假设我想找到从0到3的最短路径。很容易看到路径是0-2,2-3,总权重为0.26 0.17=0.43。但是我应该如何构造一个通用的方法来实现这一点?在伪码中
这是为什么大多数图算法不那么容易适应负数的后续问题?。 我认为最短路径(SP)存在负权重的问题,因为它将路径上的所有权重相加,并试图找到最小权重。 但我不认为最小生成树(MST)在负权值上有问题,因为它只取单个最小权值边,而不关心整体总权值。 我说的对吗?