我有这个问题。我有一个由n个节点组成的图,我想将其分成两个子图,一个包含x个节点,另一个包含n-x个节点,同时满足保留边数最大化(或者最小化切断的边数)的约束。
不确定是否清楚。虽然不是图论专家,但这是我的问题的抽象版本。我应该查看哪些算法能够帮助我呢?
这不是一道作业题。我认为这是一个有趣的问题!
我计划使用C来实现。
我有这个问题。我有一个由n个节点组成的图,我想将其分成两个子图,一个包含x个节点,另一个包含n-x个节点,同时满足保留边数最大化(或者最小化切断的边数)的约束。
不确定是否清楚。虽然不是图论专家,但这是我的问题的抽象版本。我应该查看哪些算法能够帮助我呢?
这不是一道作业题。我认为这是一个有趣的问题!
我计划使用C来实现。
当 x = n - x 时,这被称为最小二分问题,并且是NP难问题。 这也使得您的问题成为NP难问题。在维基百科关于图分区的文章中描述了几种启发式方法,包括局部搜索(例如,从随机切割开始,并重复交换减少切割大小的顶点对)和谱方法(例如,计算并阈值化第二特征向量)。 如果 n 很小,整数规划也是一种可能性。
基本上你正在看一个修改版的最小割问题。
一种方法是修改Karger算法 在Karger算法中,您沿着随机边缩小顶点,直到最终只剩下两个顶点,剩余的边代表割。由于这是随机的,因此您只需多次执行此操作并保留割中边最少的解决方案即可。
在修改后的版本中,一旦顶点被折叠x次,您可以停止折叠并计算出度边数(这些将是您的割),适当地执行多次,就可以得到一个解决方案。棘手的部分是确定重复计算的次数,以增加信心至令人满意的程度。