给出无向图。如何检查是否可以将其分为两组,其中一组中的每个节点都连接到其自身组的每个其他节点(完整图形)。集合可以是空的,也可以只有一个节点。不应该留下任何节点。 感谢。
编辑:不禁止两组之间的边缘。
基本上我们必须检查图表是否可以分为两个派系
答案 0 :(得分:5)
正如@Damien评论的那样,检查给定图的顶点是否可以划分为两个集团实际上是clique cover的决策问题,其中k = 2.对于一般k(即使对于k = 3),已知clique cover问题是NP完全的。对于k = 2,根据下面的观察,存在O(n 2 )算法。
给定图G =(V,E),将其补码表示为G'。然后,当且仅当G'是2可着色时,V可以被分成两个派系。
证明很简单,因此在此省略。算法草图如下所示。
01. construct G' from G;
02. if G' is bipartite
03. return true;
04. else
05. return false;
注意第一行需要O(n 2 )时间,而测试G'是否为二分仅需要使用BFS的O(n + m)时间,其中n是顶点数和m是边缘的#。因此,总复杂度为O(n 2 )。