Advertisement
Guest User

Untitled

a guest
Dec 15th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.77 KB | None | 0 0
  1.  
  2. # coding: utf-8
  3.  
  4. # # Алгоритм Флойда-Уоршелла
  5.  
  6. from random import choice
  7. import numpy as np
  8.  
  9. # ## Список смежности
  10.  
  11. def adjency_list(edges=None, vertices=None, undirected=False, edges_count=10):
  12.     if edges is None or vertices is None:
  13.         edges = []
  14.         vertices = set()
  15.         for i in range(edges_count):
  16.             v, u = sample(ascii_lowercase, 2)
  17.             edges.append((v, u))
  18.             vertices.add(v)
  19.             vertices.add(u)
  20.         list(vertices)
  21.        
  22.     adj_list = {v1: set() for v1 in vertices}
  23.     for u, v, w in edges:
  24.         adj_list[u].add((v, w))
  25.         if undirected:
  26.             adj_list[v].add((u, w))
  27.     return adj_list
  28.  
  29.  
  30. def input_graph(undirected=False):
  31.     edges_count = int(input('Введите кол-во ребер: '))
  32.     edges = []
  33.     vertices = set()
  34.     for i in range(edges_count):
  35.         u, v, w = list(map(int, input('Введите 2 вершины и вес через пробел: ').split()))
  36.         edges.append((u, v, w))
  37.         vertices.add(u)
  38.         vertices.add(v)
  39.     return adjency_list(edges, list(vertices), undirected=undirected)
  40.  
  41.  
  42. def floyd_warshall(adj_list):
  43.     dist = np.full((len(adj_list), len(adj_list)), np.inf)
  44.     for i in adj_list.keys():
  45.         dist[i, i] = 0
  46.         for j, w in adj_list[i]:
  47.             dist[i, j] = w
  48.            
  49.     for k in range(len(adj_list)):
  50.         for i in range(len(adj_list)):
  51.             for j in range(len(adj_list)):
  52.                 dist[i,j] = min(dist[i, j],
  53.                                 dist[i, k] + dist[k, j])
  54.     return dist
  55.  
  56.  
  57. # ### Демонстрация
  58.  
  59. def main():
  60.     a = input_graph()
  61.     print(floyd_warshall(a))
  62.    
  63.  
  64. if __name__ == '__main__':
  65.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement