拆分点集,算法

xan*_*xan 5 algorithm

我正在学习测试,我无法解决这个问题:

我们给出一组n <1000个点和一个整数d.任务是创建两个不相交的点集A_1A_2(该集合给出n个点的集合),使得来自A_i(对于i = 1或2)的每对点之间的距离(欧几里得)较小或者等于d.如果不可能,请打印-1.

例如,输入:

d = 3,分:

(5,3),(1,1),(4,2),(1,3),(5,2),(2,3),(5,1)

我们可以创建:

A_1 = {(2,3),(1,3),(1,1)}

A_2 = {(5,3),(4,2),(5,2),(5,1)}

因为来自A_i的每对点(对于i = 1或2)足够接近.

我真的想知道如何解决它,但不知道.由于n很小,算法甚至可以是O(n ^ 2 log n),但我不知道如何启动.我在想,也许从计算每对点之间的距离开始,然后取两个最大距离点并将它们放入不同的点(如果它们的距离大于d).然后对剩下的对重复此步骤,但问题是如何决定合法地放置下一个点的位置.任何人都可以帮助这个算法吗?

Loï*_*ier 5

让我们考虑一个带有n个节点的简单图(对应于n个点).如果两个对应点之间的距离大于d,则连接两个节点.

如果可以创建两个脱离集,我们必须有一个双向图(如果某些节点没有连接到其他节点,它们可以放在任何集合中).

因此,我们只需要测试图的二分性,这很简单:

http://en.wikipedia.org/wiki/Bipartite_graph#Testing_bipartiteness