[英]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" }
如何解决每个群体应该具有相同要素的问题。
首先,让我们假设图是双向的,所以有一些解决方案。
将图形拆分为一组连接的组件: (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
是图中边的数量。
您从给定节点构建图形(使用散列表将名称映射到节点)然后使用BFS或DFS遍历图形并确定其是否为二分(即,divisibe为两个不相交的集合,使得节点在一个集合只是在另一个集合中的节点“麻烦”,而不是在它自己的集合中的任何节点)。 这是通过为BFS / DFS访问的每个节点分配一个布尔值,然后检查其任何访问的邻居是否具有相同的值来完成的,这意味着该图不是二分的(不能分成两组)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.