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;
}};