将整数数组划分为 2 个不相连的部分

Partition an integer array into 2 unconnected parts

给定一个 int 数组(每个元素的值等于它的索引),长度为 n 并且数组元素之间的连接为 m。将数组分成 2 部分(相对于给定的 m 连接,部分中的所有元素必须 未连接

如果存在这样的分区则输出true,否则false.

这里有 3 个例子:

  1. 给定数组:{0, 1, 2, 3}

    给定连接:0-12-3(0 连接到 1,2 连接到 3)

    输出应为:true(分区为{0,3}{1,2}

  2. 给定数组:{0, 1, 2}

    给定连接:1-20-10-2

    输出应为:false(没有 2 个分区仅包含未连接的元素)

  3. 给定数组:{0,1}

    给定连接:0-1

    输出应为:true(分区为{0}{1}

我目前的方法:形成数组元​​素之间的所有可能连接并存储它们,从我存储的连接中删除 m 传入连接,检查剩余连接是否形成给定数组的 2 个分区。这个解决方案太慢了(我怀疑建立所有可能的连接需要太多时间)。

问题是测试给定的图是否是bipartite, i.e. 2-colorable, which can be done efficiently by using depth-first search。从任意节点开始,为其分配两种颜色中的任何一种。对于迭代的每条边,为目标节点赋予与其父节点不同的颜色。如果这不可能,则终止搜索,因为输入不是二分的。否则,您已经生成了表示两个分区的图形的二次着色。