我该如何继续这样做? 这是一个功课,我遇到了很大的问题。 现在,问题是我不能使用lib。
我的图表如下:
{'A': {'C': 2, 'B': 10}, 'C': {'B': 7, 'D': 2}, 'B': {}, 'D': {'A': 5, 'B': 4}}
使用从文件中获取的词典。
我在http://www.python.org/doc/essays/graphs/使用算法查找所有路径,因此没有问题。
但是现在我已经拥有了从一个点到另一个点的所有路径,我需要对权重求和并获得完整的成本。
如果你能帮助我,并指导我采取一些好的方法来接近它,我将不胜感激。
答案 0 :(得分:2)
查看networkx
- 这是一个非常好的Python图形库。阅读它的文档,你会发现有一个简单的解决方案 - 因为它的功课我不会评论更多,直到你找到编码问题。
答案 1 :(得分:1)
gr = {'A': {'C': 2, 'B': 10},
'C': {'B': 7, 'D': 2},
'B': {'E': 2},
'D': {'A': 5, 'B': 4, 'E': 3}
'E': {}}
def paths(gr, frm, to, path_len=0, visited=None):
if frm == to:
return [[to, path_len]]
visited = visited or []
result = []
for point, length in gr[frm].iteritems():
if point in visited:
continue
visited.append(point)
for sub_path in paths(gr, point, to, path_len + length, visited[:]):
result.append([frm] + sub_path)
return result
>>> print paths(gr, 'A', 'E')
[['A', 'C', 'B', 'E', 11], ['A', 'C', 'D', 'E', 7], ['A', 'B', 'E', 12]]
答案 2 :(得分:0)
嗯,你已经完成了寻找路径的困难部分。现在只需通过路径并对这些权重求和。我会用一个循环。
int sum=0;
for(int i=0;i<path.size()-1;i++)
sum+= node.at(i).getWeightFor(node.at(i+1))
其中getWeightFor(node)
将返回从该节点转到另一个节点的成本。所以如果你做A.getWeightFor(C)
,它会返回2.有可能有更好的方法来做,但这是我快速回答的事情。你必须制作getWeightFor函数,但这应该很简单。就像我说的那样,困难的部分已经完成。不要过分思考最后一点。