Advertisement
cat_baxter

Hungarian algorithm O(N^3)

May 3rd, 2012
1,615
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.04 KB | None | 0 0
  1.  
  2. INF = 100000000000000000
  3.  
  4. def hungarian(matrix):
  5.     h, w,  = len(matrix), len(matrix[0])
  6.     u, v, ind = [0]*h, [0]*w, [-1]*w
  7.     for i in range(h):
  8.         links, mins, visited = [-1]*w, [INF]*w, [False]*w
  9.         markedI, markedJ, j = i, -1, 0
  10.         while True:
  11.             j = -1
  12.             for j1 in range(h):
  13.                 if not visited[j1]:
  14.                     cur = matrix[markedI][j1] - u[markedI] - v[j1]
  15.                     if cur < mins[j1]:
  16.                         mins[j1] = cur
  17.                         links[j1] = markedJ
  18.                     if j == -1 or mins[j1] < mins[j]: j = j1
  19.             delta = mins[j]
  20.             for j1 in range(w):
  21.                 if visited[j1]:
  22.                     u[ind[j1]] += delta;  v[j1] -= delta
  23.                 else:
  24.                     mins[j1] -= delta
  25.             u[i] += delta
  26.             visited[j] = True
  27.             markedJ, markedI = j, ind[j]
  28.             if markedI == -1:
  29.                 break
  30.         while True:
  31.             if links[j] != -1:
  32.                 ind[j] = ind[links[j]]
  33.                 j = links[j]
  34.             else:
  35.                 break
  36.         ind[j] = i
  37.     return [(ind[j], j) for j in range(w)]
  38.  
  39. m = [[INF, 7858, 8743, 17325, 18510, 9231, 4920, 7056, 9701, 5034, 7825],
  40.      [8128, INF, 5021, 13603, 19635, 11386, 7075, 8840, 1843, 7189, 9256],
  41.      [6809, 5364, INF, 8582, 14614, 10067, 5756, 5904, 7207, 3882, 4235],
  42.      [7849, 5515, 1040, INF, 15654, 11107, 6796, 4713, 7358, 4900, 5275],
  43.      [10918, 8365, 4109, 5808, INF, 14176, 9865, 7928, 931, 7991, 8344],
  44.      [336, 7285, 2830, 11412, 17444, INF, 4347, 6483, 6688, 4461, 7065],
  45.      [1053, 2938, 3823, 12405, 15835, 4311, INF, 2136, 4781, 114, 2905],
  46.      [8930, 802, 5823, 14405, 20437, 12188, 7877, INF, 2645, 7429, 10058],
  47.      [9987, 7434, 3178, 11760, 17792, 13245, 8934, 6997, INF, 7060, 7413],
  48.      [10518, 2824, 3709, 12291, 15721, 13776, 9465, 2022, 4667, INF, 7944],
  49.      [2574, 4459, 5344, 9561, 17356, 5832, 1521, 3657, 6302, 1635, INF]
  50.     ]
  51.  
  52. print(hungarian(m))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement