繁体   English   中英

将图表分为两组

[英]Divide a graph into two sets

问题来自Code jam

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

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

首先,可行性问题(有这样的设置/不存在这样的设置)是2着色问题 ,其中:

G = (V,E)
V = { all nodes } 
E = { (u,v) | u and v are "troubling each other" } 

通过检查图形是否是双向的 ,可以使用BFS完成此问题。


如何解决每个群体应该具有相同要素的问题。

首先,让我们假设图是双向的,所以有一些解决方案。

将图形拆分为一组连接的组件: (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]分成AB ,使得sum{A}尽可能接近sum{B} 如果arr[i]A ,在您的解决方案中,将Li标记为“1”,将Ri标记为“2”。 否则 - 做相反的事情。

解是O(k*n+m) ,其中k是连通分量的数量, n是图中节点的数量, m是图中边的数量。

您从给定节点构建图形(使用散列表将名称映射到节点)然后使用BFS或DFS遍历图形并确定其是否为二分(即,divisibe为两个不相交的集合,使得节点在一个集合只是在另一个集合中的节点“麻烦”,而不是在它自己的集合中的任何节点)。 这是通过为BFS / DFS访问的每个节点分配一个布尔值,然后检查其任何访问的邻居是否具有相同的值来完成的,这意味着该图不是二分的(不能分成两组)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM