问题一 最短距离
先从一个问题说起,输入 = [4, 1, 4, 6, 4, 0, 6]代表依赖关系,从1开始,0代表ROOT节点。第二个元素为1代表第二个term在依赖树上的父节点为第1个term。
输出
[[0 1 0 0 0 0 0]
[0 0 0 0 0 0 0]
[0 0 0 0 0 0 0]
[1 2 1 0 1 0 0]
[0 0 0 0 0 0 0]
[2 3 2 1 2 0 1]
[0 0 0 0 0 0 0]]
这个题目的下标和方向非常别扭,等于7个数表示了8个节点,画成图就下面这样
如果能理解题目,那么可以想到用Floyd算法,写成代码就是:
import torch
import sys
def cal_min_dis(input):
l = len(input)
max_dis = l*2
a = torch.ones(l+1,l+1,dtype=torch.int32)*max_dis
for i in range(l):
a[input[i]][i+1] = 1
for k in range(l+1):
for i in range(l+1):
for j in range(l+1):
if a[i][j] > a[i][k] + a[k][j]:
a[i][j] = a[i][k] + a[k][j]
a[a == max_dis] = 0
return a[1:,1:]
if __name__ == '__main__':
indices = [4, 1, 4, 6, 4, 0, 6]
print(cal_min_dis(indices))
问题二 邻接矩阵乘法的意义
A^n中,A[i][j]表示的是从i出发走到点j走n步,有多少种走法。以下转载自 https://www.163.com/dy/article/I453AEUV05328ZJ2.html
问题三 恰好经过 K 条边最短路径
刚好把问题一和问题二加在一起就是结果