【问题标题】:Algorithm for node assignment in graph图中节点分配的算法
【发布时间】:2020-07-08 19:29:23
【问题描述】:

图中有 N 个节点 (1 ≤ N ≤ 2⋅10^5) 和 M (1 ≤ M ≤ 2⋅10^5) 个有向边。每个节点都有一个我们正在尝试确定的分配编号(1...N 范围内的整数)。

具有某个指定编号的所有节点将具有通向具有另一个指定编号的其他节点的有向边。这也意味着如果一个节点有多个有向边从它出来,那么它通向的节点都具有相同的分配编号。我们必须使用这些信息来确定数字的分配,以使所有节点之间的不同数字的数量最大化。

因为有多个可能的答案,所以输出应该是按该顺序最小化分配给节点 1…N 的数字的分配。从本质上讲,答案是按字典顺序最小的。

例子:

在 9 个节点和 12 条边的图中,这里是边。对于每一行的ij这两个整数,有一条从ij的有向边。

3 4
6 9
4 2
2 9
8 3
7 1
3 5
5 8
1 2
4 6
8 7
9 4

正确的分配是节点1、4、5的分配编号1;节点 2、6、8 具有分配的编号2;并且节点 3、7、9 具有分配的编号3。这是有道理的,因为节点 1、4、5 通向节点 2、6、8,而节点又通向节点 3、7、9。

为了解决这个问题,我认为您可以创建一个图,其中包含断开的子图,每个子图代表一组具有相同分配编号的节点。为此,我可以简单地扫描所有节点,如果一个节点有多个指向其他节点的有向边,您应该将它们作为连接组件添加到您的图中。如果某些节点已经在图中,您可以简单地在当前组件之间添加边。

然后,对于其余节点,您可以找到它们将边指向哪些节点,并以某种方式使用该信息将它们添加到您的新图中。

这个策略会奏效吗?如果是这样,我该如何正确实现算法的第二部分?

编辑 1:之前我错误地解释了问题陈述;我现在已经发布了正确的解释和我解决问题的新方法。

编辑 2:因此,一旦我遍历所有节点一次,以上述方式添加边,我将确定每个节点的组件。然后我将再次遍历节点,这次确保将其余边递归地添加到图中。例如,如果一个分配了编号的节点与一个没有分配编号的节点有一条有向边,我可以将该节点添加到其指定的组件中。我也可以使用 Union Find 来维护组件。

虽然这会足够快,但我担心可能会出现错误 - 例如,当我执行此递归解决方案时,可能会在为一个节点分配一个编号时,连接其他分配了编号的节点到该节点可能无法使用它。基本上会有矛盾。我必须想出一个解决方案。

【问题讨论】:

  • 节点 4 和 5 具有共同的祖先节点 3,因此它们可以具有相同的值。为什么要为节点 1 分配与节点 4/5 相同的值?
  • 例如,我使用了问题陈述中给出的示例案例。在示例案例的解决方案中,节点 1 被分配了与节点 4 和 5 相同的值。我不知道为什么大声笑 - 这样做可能是为了让它在字典上更小。
  • 你自己写了determine an assignment of numbers such that the number of distinct numbers among all nodes is maximized。所以给节点 1:1 值,节点 2,6,8:2 值,节点 3,7,9:3 值和节点 4,5:4 值是有意义的,请澄清问题? (注意同样的问题适用于8,为什么它和2,6在同一个班级,为什么9和3,7在同一个班级)
  • 我的措辞完全来自问题陈述。我对如何分配 8 和 9 的值有同样的困惑,我希望有人能为我澄清为什么这就是为什么分配它们 - 我会试着问,但你能确定如何对节点进行分组分组分配相同的号码?
  • 你只需要考虑一个图 G 并在共享相同值的节点之间创建一条边。然后统计断开的子图

标签: algorithm optimization graph language-agnostic


【解决方案1】:

对于每个节点,打印 rand() % rand() + 1 并祈祷。有奉献精神,您可能会通过所有案例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-12
    • 2014-04-09
    • 2012-09-09
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多