Ecco un esercizio nel numero Algorithm Design Manual.Come trovare un triangolo all'interno di un grafico?
consideri il problema di determinare se un grafo orientato G = (V, E) contiene un triangolo o ciclo di lunghezza 3.
(a) Fornire un O (| V |^3) per trovare un triangolo se ne esiste uno.
(b) Migliora l'algoritmo per l'esecuzione nel tempo O (| V | · | E |). Puoi assumere | V | ≤ | E |.
Si osservi che questi limiti ti dà il tempo per la conversione tra i adiacenza matrice e lista di adiacenza rappresentazioni di G.
Ecco il mio pensiero:
(a) Se il grafico è dato come un elenco di adiacenza, posso convertire l'elenco in matrice con O (| V |^2). quindi faccio:
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;
Questo dovrebbe dare un O (| V |^3) per testare il triangolo.
(b) Il mio primo intuitivo è che se il grafico viene fornito come elenco di adiacenza, allora farò un bfs. Ogni volta che viene trovato un bordo incrociato, ad esempio, if y-x is a cross edge
, allora lo sarà check whether parent[y] == parent[x], if true, then a triangle is found
.
Qualcuno potrebbe dirmi se il mio modo di pensare è corretto o no?
Anche per questo (b), non sono sicuro della sua complessità. Dovrebbe essere O (| V | + | E |), giusto?
Come posso farlo in O (| V | * | E |)?
Le prime tre righe di (a) iterano su tutti i bordi ... – uty
@uty, cosa intendi? –
Dato che si ottimizza (a) un bit, il ciclo più interno viene eseguito solo se ij è un margine. Quindi un'analisi più attenta dà un costo O (V^2) per quando ij è un nonedge e O (EV) per quando ij è un bordo, per un totale di O (EV) supponendo che E> = V. – uty