Aquí hay un ejercicio en el Algorithm Design Manual.¿Cómo encontrar un triángulo dentro de un gráfico?
considerar el problema de determinar si un grafo no dirigido G dado = (V, E) contiene un triángulo o ciclo de longitud 3.
(a) Dar un O (| V |^3) para encontrar un triángulo, si existe.
(b) Mejore su algoritmo para ejecutar en tiempo O (| V | · E |). Puede suponer | V | ≤ | E |.
Obsérvese que estos límites le da tiempo para convertir entre los adyacencia matriz y lista de adyacencia representaciones de G.
Aquí está mi pensamiento:
(a) Si el gráfico se administra como una lista de adyacencia, puedo convertir la lista a matriz por O (| V |^2). entonces lo hago:
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;
Esto debería dar una O (| V |^3) para probar el triángulo.
(b) Mi primera intuición es que si el gráfico se da como una lista de adyacencia, entonces haré un bfs. Siempre que se encuentre un borde transversal, por ejemplo, if y-x is a cross edge
, entonces lo haré check whether parent[y] == parent[x], if true, then a triangle is found
.
¿Alguien podría decirme si mi pensamiento es correcto o no?
También para esto (b), no estoy seguro de su complejidad. ¿Debería ser O (| V | + | E |), ¿verdad?
¿Cómo puedo hacerlo en O (| V | * | E |)?
Las primeras tres líneas de (a) se repiten en todos los bordes ... – uty
@uty, ¿qué quieres decir? –
Dado que optimizó (a) un bit, el bucle más interno se ejecuta solo si ij es un borde. Por lo tanto, un análisis más cuidadoso da el costo O (V^2) para cuando ij es un no-cultivo y O (EV) para cuando ij es un borde, para un total de O (EV) suponiendo que E> = V. – uty