本文由 大侠(AhcaoZhu)原创,转载请声明。
链接: https://blog.csdn.net/Ahcao2008
前言
本文源起于,在CSDN 问答题中,有这样一道题,原题目见:
链接: 请问这个代码该怎么改,大佬帮帮我!
我尝试着在原问答处,作了解答;但是基于两点原因:一是感觉意犹未尽,还想借题发挥一下;二是对于过程,需要详细说明,特别是还有一些图,一些引申的想法,也许对于一些做项目的朋友有所帮助,所以,借此写一篇文章吧。
此外,也正好是接触、学习python 快满百天了,借此篇文章纪念吧。真不知道我对此的兴趣还能持续多久。
题目
- 利用复合数据类型表达有向图,要求每条边同时具有空间距离和时间距离。
- 编写Path类表示路径。该类应包括用复合数据类型表示的具体路径和费用,应具有增加节点产生新路径的方法。产生路径后,费用同步更新,且为只读属性。
- 编写有向图类DirectedGraph。该类应具有存储有向图数据的属性,具有产生所有可行路径的私有方法,具有从所有可行路径中搜索出空间和时间最短路径并打印到控制台的方法。
- 对于任意两个节点,输出空间和时间最短路径和费用。
原题的代码
class DirectedGraph(object):
#构造函数,利用原始图初始化有向图类
def __init__(self, d):
if isinstance(d, dict):
self.__graph = d
else:
self.__graph = dict()
print('Sth error')
#通过递归生成所有可能的路径
def __generatePath(self, graph, path, end, results):
current = path[-1]
if current == end:
results.append(path)
else:
for n in graph[current]:
if n not in path:
self.__generatePath(graph, path + [n], end, results)
#搜索start到end之间最短的路径,并输出
def searchPath(self, start, end):
self.__results = []
self.__generatePath(self.__graph, [start], end, self.__results)
self.__results.sort(key = lambda x:len(x)) #按所有路径的长度进行排序
print('The path from ',self.__results[0][0], ' to ', self.__results[0][-1], ' is:')
for path in self.__results:
print(path)
d = {
'A':{
'B':(3,6), 'C':(3,8), 'D':(5,2)},
'B':{
'E':(5,8)},
'C':{
'D':(6,1), 'F':(8,3)},
'D':{
'B':(7,4), 'E':(11,4), 'G':(4,9)},
'E':{
'D':(9,2)},
'F':{
'D':(3,1), 'G':(2,7)},
'G':{
'E':(5,8)}}
g = DirectedGraph(d)
g.searchPath