Dynamic Programming--shortest path

import unittest
#       A  B1 B2 C1 C2 C3 C4 D1 D2 D3 E
graph=[
       [0, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 6, 3, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 8, 0, 4, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
]
path=[]
minval=[]
for i in range(11):
 path.append(0)
 minval.append(0)
 print graph[i]

def min_distance(graph, begin, size):
 i = begin;
 cur_pass_node =0
 min_dis = 1000
 if (minval[begin]>0):
  return minval[begin]
 if (i == size-1):
  return 0
 for i  in range(begin + 1, size):
  if graph[begin][i] > 0:
   t = min_distance(graph, i, size) + graph[begin][i]
   if (t < min_dis):
    min_dis = t
    cur_pass_node = i
 path[begin]=cur_pass_node
 minval[begin]= min_dis
 return min_dis


class mytest(unittest.TestCase):
 def setUp(self):
  pass
 def tearDown(self):
  pass
 def test_min_distance(self):
  print "mindis", min_distance(graph,0,11), path
  print '--------'
  print print_path(path)

def print_path(path):
 t=0
 while t != 10:
  begin =t
  t = path[t]
  print t, graph[begin][t]


if __name__ == "__main__":
 unittest.main()

 

posted @ 2016-04-21 19:04  zhaodonglin  Views(163)  Comments(0)    收藏  举报