Given an undirected graph G = (V, E), determine wh

2019-09-19 12:20发布

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.

4条回答
Emotional °昔
2楼-- · 2019-09-19 12:32

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)

查看更多
We Are One
3楼-- · 2019-09-19 12:35

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.

查看更多
甜甜的少女心
4楼-- · 2019-09-19 12:36

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.

查看更多
可以哭但决不认输i
5楼-- · 2019-09-19 12:42

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.

查看更多
登录 后发表回答