LeetCode399 除法求值(floyd)

LeetCode399 除法求值(floyd)_第1张图片
Floyd-Warshall算法: O ( ∣ V ∣ 3 ) O(|V|^3) O(V3) 内计算任意两点的最短路。(dp的思想)
计算点 ij 的最短路,考虑最短路是否会经过点 k 。有两种情况:

  • 经过点 kd[i][j] = d[i][k] + d[k][j]
  • 不经过 kd[i][j]

则最短路的状态转移方程:d[i][j] = min(d[i][j], d[i][k] + d[k][j])
使用三个 for 循环,完成计算(从外到内分别处理 k、i、j

for(int k = 0; k < N; i++){
   
	for(int i = 0; i < N; i++) {
   
		for(int j = 0; j < N; j++) {
   
			d[i][j] = min(d[i][j], d[i][k] + d[k][j])
		}
	}
}

在本题中,使用 Floyd 算法需要做一些小改进

  • dp[i][i] 初始化为1
  • 状态转移方程变为乘法 dp[i][j] = min(dp[i][j], dp[i][k]*dp[k][j])
  • 不能到达的点始终维持 INT_MAX,不能相乘

附上代码:

Floyd算法

class Solution {
   
public:
    vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
   
        vector<double> out;
        map<string, int> proj;
        int cnt = 0;
        for(auto x : equations){
   
            if<

你可能感兴趣的:(dfs,图,leetcode,深度优先)