Here is an exercise in the Algorithm Design Manual.
Consider the problem of determining whether a given undirected graph G = (V, E) contains a triangle or cycle of length 3.
(a) Give an O(|V |^3) to find a triangle if one exists.
(b) Improve your algorithm to run in time O(|V |·|E|). You may assume |V | ≤ |E|.
Observe that these bounds gives you time to convert between the adjacency matrix and adjacency list representations of G.
Here is my thoughts:
(a) If the graph is given as an adjacency list, I can convert the list to matrix by O(|V|^2). then I do:
for (int i = 0;i < n;i++)
for (int j = i+1;j < n;j++)
if (matrix[i][j] == 1)
for (int k = j+1;k < n;k++)
if (matrix[i][k] == 1 && matrix[j][k] == 1)
return true;
This should give a O(|V|^3) to test the triangle.
(b) My first intuitive is that if the graph is given as an adjacency list, then I will do a bfs. Whenever a cross edge is found, for example, if y-x is a cross edge
, then i will check whether parent[y] == parent[x], if true, then a triangle is found
.
Could anyone tell me whether my thinking is correct or not?
Also for this (b), I am not sure its complexity. Should it be O(|V| + |E|), right?
How can I do it in O(|V|*|E|)?