给定一个无向图G = (V, E),判断G是否是完全图

Given an undirected graph G = (V, E), determine whether G is a complete graph

我很确定这个问题是 P 而不是 NP,但我很难想出一个多项式约束算法来解决它。

你可以:

  1. 检查图中的边数是否为 n(n-1)/2
  2. 检查每个顶点是否连接到精确 n-1 个不同的顶点。

这将 运行 in O(V²),这是多项式。

希望对您有所帮助。

这是一个 O(E) 算法:

  1. 使用 O(E) 作为输入时间,扫描图形
  2. 同时,记录每个顶点p的度数,增加度数只有当邻居不是p本身(自连边)不是顶点 q,其中 p 和 q 已经计算了另一条边(多边),这些检查可以在 O(1)
  3. 中完成
  4. 检查所有顶点的度是否为|V|-1,这一步为O(V),如果是则为完整图

总计为 O(E)

这是一个 O(|E|) 算法,它也有一个小常数。

枚举完整图中的每条边是微不足道的。所以你需要做的就是扫描你的边列表并验证每条这样的边都存在。

对于每条边 (i, j),令 f(i, j) = i*|V| + j。假设顶点编号为 0 到 |V|-1。

bitvec为长度为|V|2的位向量,初始化为0。

对于每条边 (i, j),设置 bitvec[f(i, j)] = 1.

G 是一个完全图当且仅当 bitvec 的每个元素 == 1.

该算法不仅涉及 E 一次,而且如果您有分散指令,它也是完全可向量化的。这也意味着并行化是微不足道的。

对于给定的图 G = (V,E),检查 V 中的每一对 u, v,并查看边 (u,v) 是否在 E 中。 u, v 对的总数为 |V|*(|V|-1)/2。结果,时间复杂度为O(|V|^2),你可以检查一个图是否完整。