Advertisement
Guest User

Untitled

a guest
Jan 17th, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.75 KB | None | 0 0
  1. import numpy as np
  2.  
  3. max_size = 20
  4. max_set = (1 << 20)
  5. source = 0
  6. INF = 999999999999
  7.  
  8. shortest_route = INF
  9. last_position = -1
  10.  
  11. dist = [[0 for x in range(max_size + 1)] for y in range(max_size + 1)]
  12. result = [[0 for x in range(max_set + 1)] for y in range(max_size + 1)]
  13. previous = [[0 for x in range(max_set + 1)] for y in range(max_size + 1)]
  14. order = []
  15.  
  16. shops = input()
  17. for i in range(0, int(shops)):
  18.   for j in range(0, int(shops)):
  19.     dist[i][j] = input()
  20.  
  21. def solve():
  22.   for i in range(1, (1 << shops)):
  23.     for j in range(0, shops):
  24.       if result[i][j] == INF:
  25.         continue
  26.      
  27.       for k in range(1, shops):
  28.         if (i & ( 1 << k )) != 0:
  29.           continue
  30.        
  31.         new_pattern = ( i | ( 1 << k ))
  32.        
  33.         if result[new_pattern][k] > result[i][j] + dist[j][k]:
  34.           result[new_pattern][k] = result[i][j] + dist[j][k]
  35.           previous[new_pattern][k] = j
  36.        
  37.    
  38.   for i in range(1, shops):
  39.     if result[ (1 << shops) - 1 ][i] <= 0:
  40.       continue
  41.    
  42.     if result[ (1 << shops) - 1 ][i] + dist[i][source] < shortest_route:
  43.       shortest_route = result[ (1 << shops) - 1 ][i] + dist[i][source]
  44.       last_position = i
  45.  
  46.   return shortest_route
  47.  
  48. def get_order(current, pattern):
  49.   if current == 0:
  50.     return
  51.  
  52.   order.append(current)
  53.   get_order( previous[pattern][current], new_pattern )
  54.   return
  55.  
  56. def init():
  57.   for i in range(1, (1 << shops)):
  58.     for j in range(0, shops + 1):
  59.       result[i][j] = INF
  60.       previous[i][j] = j
  61.  
  62.   result[1][0] = 0
  63.   return
  64.  
  65.  
  66.    
  67. init()
  68. print(solve())
  69. print("\n")
  70.  
  71. order.append(0)
  72. get_order(last_position, (1 << shops) - 1)
  73. order.append(0)
  74. order.reverse()
  75.  
  76. for i in range(0, len(order)):
  77.   print(order[i])
  78.   print(" ")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement