Algorithm 把一张图分成两组

Algorithm 把一张图分成两组,algorithm,data-structures,graph,Algorithm,Data Structures,Graph,这个问题来自于 问题: 有没有办法把一个图的节点分成两个组,使得不能留在同一组中的任何两个节点应该在不同的组中。 这有什么标准算法吗 当每个组都应该有相等的元素时,我应该如何解决这个问题。从给定的节点构建一个图(使用哈希表将名称映射到节点),然后使用BFS或DFS遍历该图,并确定它的二部(即,划分为两个不相交的集合,使得一个集合中的一个节点仅处于“故障”状态)与其他集合中的节点一起,但不与自己集合中的任何节点一起)。这是通过为BFS/DFS访问的每个节点分配一个布尔值,然后检查其任何访问的邻居是

这个问题来自于

问题:
有没有办法把一个图的节点分成两个组,使得不能留在同一组中的任何两个节点应该在不同的组中。
这有什么标准算法吗


当每个组都应该有相等的元素时,我应该如何解决这个问题。

从给定的节点构建一个图(使用哈希表将名称映射到节点),然后使用BFS或DFS遍历该图,并确定它的二部(即,划分为两个不相交的集合,使得一个集合中的一个节点仅处于“故障”状态)与其他集合中的节点一起,但不与自己集合中的任何节点一起)。这是通过为BFS/DFS访问的每个节点分配一个布尔值,然后检查其任何访问的邻居是否具有相同的值来完成的,这意味着该图不是二部图(不能分成两组)

首先,可行性问题(是否存在此类集合/不存在此类集合)是,其中:

这个问题通过检查图形是否正确来解决,并且可以使用


当每个小组都应该有相等的元素时,如何解决这个问题

首先,假设这个图是双向的,所以有一些解决方案

将图形拆分为一组连接的组件:
(S1、S2、S3、…、Sk)

每个连通分量实际上是一个子图(Si=Li,Ri)-其中Li,Ri是二部图的两侧(如果忽略Li和Ri的顺序,每个连通分量中只有一个这样的拆分)

创建新阵列:

arr[i] = |Li| - |Ri|   
where |X| is the cardinality of X (number of elements in the set)
现在,解决这个问题与解决相同,可以在伪多项式时间内完成(节点数为多项式)

分区问题的解决方案将每个
arr[i]
拆分为
A
B
,使得
sum{A}
尽可能接近
sum{B}
。如果
arr[i]
位于
A
中,则在您的解决方案中,将
Li
用“1”着色,将
Ri
用“2”着色。否则,请反其道而行之


解决方案将是
O(k*n+m)
,其中
k
是连接组件的数量,
n
是图中的节点数量,
m
是图中的边数量。

为什么被否决?我看到它没有回答问题的第二部分,但对于第一部分来说,它绝对是好的,所以我不认为这个答案“没有用”。@amit我没有投反对票(事实上,在你的评论之后我投了更高的票),但仔细阅读了这两个答案后,我有点后悔。离第二部分还有很长的路要走。当然,我更愿意对你的答案投赞成票,而不是对这个答案投反对票。可能是第一个答案的人投了反对票(我想现在已经删除了),我投了反对票,因为它说你必须找出这个图是否有圈(这是错误的,一个二部图可以有偶数长度的圈)我错过了第二部分。。。无论如何,我想您必须按降序对数组(arr)排序,然后将每个项添加到A或B depending中,其中一项在该点上的运行总数最低。@gen-y-s不,这是解决分区问题的贪婪方法,这是次优的。这是用O(n*k)时间中的动态规划来解决的好,我看到了描述DP算法的文章的链接。。。。我没有看这篇文章就提出了贪婪的方法。。。
arr[i] = |Li| - |Ri|   
where |X| is the cardinality of X (number of elements in the set)