|
| 1 | +# Grafos - Algoritmo de Floyd-Warshall em Python |
| 2 | +# Alexandre Lima - 2021 |
| 3 | +# https://github.com/alelimasilva |
| 4 | + |
| 5 | +from math import inf |
| 6 | + |
| 7 | +def gerar_matriz (n_linhas, n_colunas): |
| 8 | + return [[0]*n_colunas for _ in range(n_linhas)] |
| 9 | + |
| 10 | +def imprime(matriz, vertices): |
| 11 | + print(' ', end='') |
| 12 | + for i in range(vertices): |
| 13 | + print(" ",i + 1,end='') |
| 14 | + print('') |
| 15 | + for i in range(vertices): |
| 16 | + print(i + 1, matriz[i]) |
| 17 | + |
| 18 | +def floyd_warshall(matriz, vertices): |
| 19 | + dist = gerar_matriz(vertices, vertices) |
| 20 | + # inicializando a matriz com infinito nas diagonais e as distancias das arestas |
| 21 | + for i in range(vertices): |
| 22 | + for j in range(vertices): |
| 23 | + if(i != j): |
| 24 | + if(matriz[i][j] != 0): |
| 25 | + dist[i][j] = matriz[i][j] |
| 26 | + else: |
| 27 | + dist[i][j] = inf |
| 28 | + else: |
| 29 | + dist[i][i] = inf |
| 30 | + # Floyd-Warshal |
| 31 | + for k in range(vertices): |
| 32 | + for i in range(vertices): |
| 33 | + for j in range(vertices): |
| 34 | + Dist = inf |
| 35 | + if(dist[i][k] != inf or dist[k][j] != inf): |
| 36 | + Dist = dist[i][k] + dist[k][j] |
| 37 | + |
| 38 | + if(i != j and Dist != inf and Dist < dist[i][j]): |
| 39 | + dist[i][j] = Dist |
| 40 | + # printando o resultado |
| 41 | + print('Matriz de distâncias') |
| 42 | + imprime(dist, vertices) |
| 43 | + |
| 44 | +def main(): |
| 45 | + grafo = [[0,3,4,0],[0,0,0,5],[0,0,0,3],[8,0,0,0]] |
| 46 | + vertices = 4 |
| 47 | + floyd_warshall(grafo, vertices) |
| 48 | + |
| 49 | +if __name__ == "__main__" : |
| 50 | + main() |
0 commit comments