这是一道算法设计手册中的练习。
考虑确定一个给定的无向图 G = (V, E) 是否包含长度为 3 的三角形或循环。
(a) 给出一个时间复杂度为 O(|V|^3) 的算法来查找是否存在三角形。
(b) 改进你的算法,使其在 O(|V|·|E|) 的时间内运行。你可以假设 |V| ≤ |E|。
注意,这些边界值允许你在邻接矩阵和邻接表表示之间进行转换。
这是我的想法:
(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)。每当找到横跨边时,例如,如果 y-x 是横跨边
,然后我将检查 parent[y] == parent[x] 是否成立,如果成立,则找到了一个三角形
。
能否有人告诉我我的想法是否正确?
对于(b)部分,我不确定它的复杂度。应该是O(|V| + |E|),对吗?
我如何在O(|V|*|E|)中完成它?