算法88---图的遍历

一、题目:解题报告,连除----399

已经给出了某些变量的比值,求新的变量的比值。如果这个变量没有出现过,或者不可到达,那么返回-1.

 

DFS思路: 

 

题目中给了顶点和顶点之间的关系,其实就是制定了这个图的样子。然后要求的新的比值其实就是从一个顶点到达另外一个顶点的路径,并且把这条路径上所有的权重相乘。

 

注意,如果a/b=3,那么从a到b是3,那么从b到a是1/3.

 

既然是从一个顶点出发到达另外一个顶点,所以应该是dfs解决的问题。
原文:https://blog.csdn.net/fuxuemingzhu/article/details/82591165

 

  1、建立图  {a:{b : 2.0} 、b:{a:1 /2.0,c:3.0}、c:{b:1/3.0}}

  2、不在图中则返回-1  

  3、在图中,x == y,返回1,x != y,返回x到y的拓扑排序的权重相乘值。

代码:

  

from collections import defaultdict
def solveque(arr ,values , que):
    if not arr:
        return [-1] * len(que)
    if not que:
        return []
    graph = defaultdict(dict)
    for (x,y) , value in zip(arr,values):
        graph[x][y] = value
        graph[y][x] = 1/value if value else 0
    for x,y in que:
        if x in graph and y in graph:
            return dfs(graph,x,y,set())
        else:
            return -1.0
def dfs(graph,x,y,visited):
    if x == y:
        return 1.0
    visited.add(x)
    for k in graph[x]:
        if k in visited:continue
        visited.add(k)
        d = dfs(graph,k,y,visited)
        if d > 0:
            return d*graph[x][k]
    return -1.0
arr = [['a','b'],['b','c']]
values = [2.0,3.0]
que = [['a','c'],['a','v']]
print(solveque(arr ,values , que))

 

posted on 2019-03-09 15:51  吱吱了了  阅读(242)  评论(0编辑  收藏  举报

导航