商队运输费

题目描述(图论)

很久以前,某王国拥有 n 个大城市,为了方便交通,国王下令修建了大量的用于连接首都和其他各大城市高速路。
为节省经费,王国采用了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。并且,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。
G商队是王国重要的运输商队,他们奔波于各大城市之间,为王国的人们运输商品,实现长途贸易。所以,从一个城市马不停蹄地到另一个城市成了G商队最常做的事情。他们有一个钱袋,用于存放往来城市间的运输费。
在运输过程中G商队发现,如果不在某个城市停下来休整,在连续行进过程中,他们所花的运输费与他们已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他们花费的运输费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。
G商队想知道:他们从某一个城市出发,如果中间不休息,到达另一个城市,所有可能花费的运输费中最多是多少呢?

输入

输入的第一行包含一个整数n,表示包括首都在内的王国的城市数
城市从1开始依次编号,1号城市为首都。
接下来n-1行,描述王国的高速路(王国的高速路一定是n-1条)
每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。输入城市数(〈10),长度(〈=100)

输出

输出一个整数,表示G商队最多花费的运输费是多少。

样例输入

5
1 2 2
1 3 1
2 4 5
2 5 4

样例输出

135

破题思路

主要涉及的函数:根据图的遍历,不断更新点到点之间的距离的递归函数update(),根据距离计算花费的函数。
其它设置:初始化一个全为0的图的邻接矩阵变量,将其设置为全局变量,方便实时共享改变的邻接矩阵变量。

程序源码

n = int(raw_input())
#如果n=5,则有dis=[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
dis = [[0 for _ in range(n)] for _ in range(n)]

def update(s,a,v):
#定义全局变量dis
    global dis
    dis[s][a] = v
    dis[a][s] = v
#print dis
#确定待更新的矩阵元素位置,存入update_list
    update_list = [i for i in range(n) if (dis[s][i] != 0 and i!= a)]
    if(len(update_list)):
        for i in update_list:
#比较s到i和i到a的距离,如果dis[a][s]+dis[s][i])<dis[i][a],则说明s为直线ai之间的一个点;如果dis[i][a] == 0,则说明a和i之间没有直达的路。两种情况都需要更新i和a点之间的距离。
            if((v+dis[s][i])<dis[i][a] or dis[i][a] == 0):
                update(i,a,v+dis[s][i])  
    else:
        return
edge_list=[]
for _ in range(n-1):
    s,a,v = map(int, raw_input().split())
    edge_list.append((s,a,v))
    dis[s-1][a-1] = v
for s,a,v in edge_list:
    update(s-1,a-1,v)
    update(a-1,s-1,v)
    
#print dis
#map先取每列的最大值,再取每列最大值的最大值
max_length = max(map(max,dis))
#max_length*10+(1+2+...+max_length)
print max_length*10+(max_length+1)*max_length/2
原文地址:https://www.cnblogs.com/wisteria68/p/12364047.html