洛谷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)
这就是整个过程了,希望对大家有所帮助。