这是算法设计手册中的一个练习。
考虑确定给定无向图 G = (V, E) 是否包含长度为 3 的三角形或环的问题。
(a) 给出 O(|V |^3) 来找到一个三角形(如果存在)。
(b) 改进你的算法以及时运行 O(|V |·|E|)。你可以假设 |V | ≤ |E|。
请注意,这些界限使您有时间在 G 的邻接矩阵和邻接列表表示之间进行转换。
这是我的想法:
(a) 如果图是作为邻接表给出的,我可以通过 O(|V|^2) 将列表转换为矩阵。然后我做:
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;
这应该给出一个 O(|V|^3) 来测试三角形。
(b) 我的第一个直觉是,如果图是作为邻接表给出的,那么我会做一个 bfs。每当找到交叉边缘时,例如,if y-x is a cross edge
,然后我会check whether parent[y] == parent[x], if true, then a triangle is found
。
谁能告诉我我的想法是否正确?
同样对于这个(b),我不确定它的复杂性。应该是 O(|V| + |E|),对吧?
我怎样才能在 O(|V|*|E|) 中做到这一点?