【发布时间】:2015-11-10 07:21:18
【问题描述】:
【问题讨论】:
标签: algorithm data-structures graph
【问题讨论】:
标签: algorithm data-structures graph
您从给定节点构建一个图(使用哈希表将名称映射到节点),然后使用 BFS 或 DFS 遍历该图并确定它是否是二分的(即,分成两个不相交的集合,使得一组中的节点仅与另一组中的节点处于“麻烦”状态,但与自己集中的任何节点无关)。这是通过为 BFS/DFS 访问的每个节点分配一个布尔值来完成的,然后检查其访问的任何邻居是否具有相同的值,这意味着该图不是二分图(不能分成两组)。
【讨论】:
首先,可行性问题(有没有这样的集合/不存在这样的集合)是2-coloring problem,其中:
G = (V,E)
V = { all nodes }
E = { (u,v) | u and v are "troubling each other" }
这个问题通过检查图形是否为bi-partite来解决,可以使用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)
现在,解决这个问题与解决partition problem 相同,可以在伪多项式时间内完成(即节点数的多项式)。
分区问题的解决方案将每个arr[i] 拆分为A 或B,使得sum{A} 尽可能接近sum{B}。如果arr[i] 在A 中,则在您的解决方案中,将Li 涂上“1”,将Ri 涂上“2”。否则 - 做相反的事情。
解决方案将是O(k*n+m),其中k 是连通分量的数量,n 是图中的节点数,m 是图中的边数。
【讨论】: