简体   繁体   中英

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

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

You can :

  1. check that number of edges in the graph is n(n-1)/2 .
  2. check that each vertice is connected to exaclty n-1 distinct vertices.

This will run in O(V²) , which is polynomial.

Hope it helped.

Here's an O(|E|) algorithm that also has a small constant.

It's trivial to enumerate every edge in a complete graph. So all you need to do is scan your edge list and verify that every such edge exists.

For each edge (i, j), let f(i, j) = i*|V| + j. Assuming vertices are numbered 0 to |V|-1.

Let bitvec be a bit vector of length |V| 2 , initialized to 0.

For each edge (i, j), set bitvec[f(i, j)] = 1.

G is a complete graph if and only if every element of bitvec == 1.

This algorithm not only touches E once, but it's also completely vectorizable if you have a scatter instruction. That also means it's trivial to parallelize.

Here is an O(E) algorithm:

  1. Use O(E) as it is input time, to scan the graph
  2. Meanwhile, record each vertex p's degree, increase degree only if the neighbor is not p itself (self-connecting edge) and is not a vertex q where p and q has another edge counted already (multiple edge), these checking can be done in O(1)
  3. Check if all vertex's degree is |V|-1, this step is O(V), if Yes then it is a complete graph

Total is O(E)

For a given graph G = (V,E), check for each pair u, v in the V, and see if edge (u,v) is in E. The total number of u, v pairs are |V|*(|V|-1)/2. As a result, with a time complexity of O(|V|^2), you can check and see if a graph is complete or not.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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