问题
I'm pretty sure this problem is P and not NP, but I'm having difficulty coming up with a polynomially bound algorithm to solve it.
回答1:
You can :
- check that number of edges in the graph is
n(n-1)/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.
回答2:
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.
回答3:
Here is an O(E) algorithm:
- Use O(E) as it is input time, to scan the graph
- 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)
- 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)
回答4:
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.
来源:https://stackoverflow.com/questions/30105886/given-an-undirected-graph-g-v-e-determine-whether-g-is-a-complete-graph