@cachedefdfs(k,i,j):if k <0:# w[i][j]为i到j的权值return w[i][j]returnmin(dfs(k-1,i,j),dfs(k-1,i,k)+dfs(k-1,k,j))
动态规划的模版
# 首先构造图,无向图
e =[[float('inf')]*n for _ inrange(n)]for f,t,d in edges:
e[f][t]= d
e[t][f]= d
# 三维数组,dp[k][i][j]表示从节点i到节点j并且中间结点<=k-1的最短距离(故意开多一个位置)
dp =[[[0]*n for _ inrange(n)]for _ inrange(n+1)]# 初始化,dpp[0][i][j] = e[i][j]
dp[0]= e[:]for k inrange(n):for i inrange(n):for j inrange(n):# 通过枚举找到最佳的情况
dp[k+1][i][j]=min(dp[k][i][j],dp[k][i][k]+dp[k][k][j])# 最终的dp[n][i][j]就是所需的答案
classSolution:deffindTheCity(self, n:int, edges: List[List[int]], distanceThreshold:int)->int:# 弗洛伊德算法其实就是递归就可以解决# 首先构造图,无向图
e =[[float('inf')]*n for _ inrange(n)]for f,t,d in edges:
e[f][t]= d
e[t][f]= d
# 定义求解的弗洛伊德算法@cachedefdfs(k,i,j):if k <0:return e[i][j]returnmin(dfs(k-1,i,j),dfs(k-1,i,k)+dfs(k-1,k,j))
ans =0
cur =float('inf')# 开始调用for i inrange(n):
count =0for j inrange(n):if i != j and dfs(n-1,i,j)<= distanceThreshold:
count+=1# 更新if count <= cur:
cur = count
ans = i
return ans
动态规划,动态规划的效率高一点
classSolution:deffindTheCity(self, n:int, edges: List[List[int]], distanceThreshold:int)->int:# 弗洛伊德算法其实就是递归就可以解决# 首先构造图,无向图
e =[[float('inf')]*n for _ inrange(n)]for f,t,d in edges:
e[f][t]= d
e[t][f]= d
# 三维数组,dp[k][i][j]表示从节点i到节点j并且中间结点<=k-1的最短距离(故意开多一个位置)
dp =[[[0]*n for _ inrange(n)]for _ inrange(n+1)]# 初始化,dpp[0][i][j] = e[i][j]
dp[0]= e[:]for k inrange(n):for i inrange(n):for j inrange(n):# 通过枚举找到最佳的情况
dp[k+1][i][j]=min(dp[k][i][j],dp[k][i][k]+dp[k][k][j])
ans =0
cur =float('inf')# 开始调用for i inrange(n):
count =0for j inrange(n):if i != j and dp[n][i][j]<= distanceThreshold:
count+=1# 更新if count <= cur:
cur = count
ans = i
return ans