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()

浙公网安备 33010602011771号