洛谷P1364医院设置Python实现

洛谷P1364医院设置Python实现

关键词:二叉树 图 Floyd

经过审题,我们大概知道,本题会用到二叉树或者的一些知识来解决。

最短路径问题我们又想到使用 Floyd算法

本题的二叉树是属于非完全二叉树,需要使用二维矩阵构建节点之间的关系。

下面开始详述:

建立二维矩阵:这个矩阵用来存储节点之间的距离,我们都初始化为0,有直接连接的点直接的距离标记为1.

j = int(input())
h = [0]*j
for i in range(j):
    h[i] = list(map(int,input().split()))
    
m = [[0]*j for x in range(j)]
for t,i in enumerate(h):
    if i[1] > 0: 
        m[i[1]-1][t],m[t][i[1]-1] = 1, 1
    if i[2] > 0: 
        m[i[2]-1][t],m[t][i[2]-1] = 1, 1    

再下来就是 使用Floyd算法构建每两个节点之间的最短路径了(也是唯一路径)

因为不是所有的点都有直接的连接,所以我们将没有直接联系的点 使用第三点 算出 其之间的 距离 直接标记在 矩阵中

我们知道二叉树中两点直接必然是有连接的,所以在将所有的点作为第三点后,必然能得出每两个点之间的距离。

for k in range(j):      
    for i in range(j):
        for p in range(j):
            if i != p:
                if m[i][p] == 0 and m[k][i] > 0 and m[k][p] > 0:
                    m[i][p] = m[i][k]+ m[p][k]
                    m[p][i] = m[i][p] 

最后遍历每个节点作为中心点时,求出所有点到中心点的距离之和,最后取最小值即可。

这个地方有一个点需要注意,题干要求的数据量可能是比较大的,所以在初始化最小值的时候切记不能过小,某些测试点会覆盖不到。

min_step = 100000
for i in range(j):
    sum_step = 0
    for k in range(j):
        sum_step += h[k][0] * m[i][k]
    if sum_step < min_step:
        min_step = sum_step
print(min_step) 

这就是整个过程了,希望对大家有所帮助。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值