FloydModificado()
início
para i = 1 até n faça
para j = 1 até n faça
A[i,j] <- D[i,j];
R[i,j] <- 0;
fim para
fim para
para i = 1 até n faça
A[i,i] <- 0;
fim para
para k = 1 até n faça
para i = 1 até n faça
para j = 1 até n faça
se A[i,k] + A[k,j] < A[i,j] então
A[i,j] <- A[i,k] + A[k,j];
R[i,j] <- k;
fim para
fim para
fim para
fim
O algoritmo de Floyd consiste de três loops:
para i = 1 até n faça
para j = 1 até n faça
A[i,j] <- D[i,j];
R[i,j] <- 0;
fim para
fim para
- O conteúdo do loop interno possui custo
2
, pois são feitas apenas duas atribuições. - O loop interno possui um custo de
1
para atribuição na inicialização de i;n+1
para os testes que serão feitos; en
para a quantidade de incrementos que serão feitos; além do custo2
do seu conteúdo executadon
vezes. Portanto, seu custo total é de2n + n + n+1 + 1
ou4n + 2
. - O loop externo possui um custo de
1
para atribuição na inicialização de i;n+1
para os testes que serão feitos; en
para a quantidade de incrementos que serão feitos; além do custo4n + 2
do seu conteúdo executadon
vezes. Portanto, seu custo total é den * (4n + 2) + n + n+1 + 1
ou4n^2 + 4n + 2
.
O custo deste primeiro loop é de 4n^2 + 4n + 2
.
para i = 1 até n faça
A[i,i] <- 0;
fim para
- O conteúdo do loop possui custo
1
, pois é feita apenas uma atribução. - O loop interno possui um custo de
1
para atribuição na inicialização de i;n+1
para os testes que serão feitos; en
para a quantidade de incrementos que serão feitos; além do custo1
do seu conteúdo executadon
vezes. Portanto, seu custo total é den + n + n+1 + 1
ou3n + 2
.
para k = 1 até n faça
para i = 1 até n faça
para j = 1 até n faça
se A[i,k] + A[k,j] < A[i,j] então
A[i,j] <- A[i,k] + A[k,j];
R[i,j] <- k;
fim para
fim para
fim para
Este loop tem dois loops internos. O mais interno possui uma condição:
se A[i,k] + A[k,j] < A[i,j] então
A[i,j] <- A[i,k] + A[k,j];
R[i,j] <- k;
-
O bloco interno do teste possui custo
3
, pois são feitas uma soma e duas atribuições. -
O custo do teste é
2
, pois tem uma adição e uma comparação. A parte interna do teste possui um custo3
, pois tem uma soma e duas atribuições. Portanto, seu custo total é5
. -
O loop interno possui um custo de
1
para atribuição na inicialização de i;n+1
para os testes que serão feitos; en
para a quantidade de incrementos que serão feitos; além do custo5
do seu conteúdo executadon
vezes. Portanto, seu custo total é de5n + n + n+1 + 1
ou7n + 2
. -
O loop intermediário possui um custo de
1
para atribuição na inicialização de i;n+1
para os testes que serão feitos; en
para a quantidade de incrementos que serão feitos; além do custo7n + 2
do seu conteúdo executadon
vezes. Portanto, seu custo total é den * (7n + 2) + n + n+1 + 1
ou7n^2 + 4n + 2
. -
O loop externo possui um custo de
1
para atribuição na inicialização de i;n+1
para os testes que serão feitos; en
para a quantidade de incrementos que serão feitos; além do custo7n^2 + 4n + 2
do seu conteúdo executadon
vezes. Portanto, seu custo total é den * (7n^2 + 4n + 2) + n + n+1 + 1
ou7n^3 + 4n^2 + 4n + 2
.
Separando a função em três partes representadas pelos loops, temos que a soma dos custos é de 4n^2 + 4n + 2
+ 3n + 2
+ 7n^3 + 4n^2 + 4n + 2
, que pode ser reduzido para 7n^3 + 8n^2 + 11n + 6
. Desconsiderando os termos que não são predominantes e a constante que multiplica o custo, podemos concluir que o algoritmo apresentado tem complexidade O(n^3)
.
void floyd_modificado(int** d, int n) {
int a[n][n], r[n][n];
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
a[i][j] = d[i][j], r[i][j] = 0;
for (int i = 0; i < n; ++i)
a[i][i] = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
for (int k = 0; k < n; ++k)
if (a[i][k] + a[k][j] < a[i][j])
a[i][j] = a[i][k] + a[k][j], r[i][j] = k;
}