find all pair using shortest path

Assuming all variables as node and a/b as path weight create a distance matrix and apply floyed warshal than for each query the ans is in one go.
class Solution {
public:

vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
    map<string,int >mp;
    int cnt=0; 
    for(int i=0; i<equations.size(); i++)
    {
        string s1=equations[i][0];
        string s2 = equations[i][1];
        if(mp.find(s1)==mp.end()){mp[s1]=cnt; cnt++;}
        if(mp.find(s2)==mp.end()){mp[s2]=cnt; cnt++;}
    }
    
    double arr[mp.size()][mp.size()];
    for(int i=0; i<mp.size(); i++)
    {
        for(int j=0; j<mp.size(); j++)
        {
            arr[i][j]= 0.0;
            if(i==j) arr[i][j]=1;
            
        }
    }
    for(int i=0; i<equations.size(); i++)
    {
        int x = mp[equations[i][0]];
        int y = mp[equations[i][1]];
        arr[x][y] = 1.0*values[i];
        arr[y][x] = 1.0/values[i];
    }
    
    for(int i=0; i<mp.size(); i++)
    {
        for(int j=0; j<mp.size(); j++)
        {
            for(int k=0; k<mp.size(); k++)
            {
                if(arr[j][i]!=0.0 && arr[i][k]!=0.0) arr[j][k]=arr[j][i]*arr[i][k];
            }
        }
    }
    
    vector<double> v;
    for(int i=0; i<queries.size(); i++)
        
    {   if((mp.find(queries[i][0])==mp.end())||mp.find(queries[i][1])==mp.end()){ v.push_back(-1.0);continue;}
        int x = mp[queries[i][0]];
        int y = mp[queries[i][1]];
        if(arr[x][y]==0.0)v.push_back(-1.0);
        else
        v.push_back(arr[x][y]);
    }
    return v;
    
}

};

Comments (0)