关键是转换成图的问题,a/b=2,那么a到b的边权重是2,b/c=4,b到c的权重是4,那么a到c就是路径的权重乘起来。中间的约去了。
然后就是要把倒数也加入到图上。
class Solution {
public:
map<string,int> name_id;
vector<vector<double>> g;
int get_id(string s){
if(name_id.count(s)==0){
name_id[s]=name_id.size();
}
return name_id[s];
}
vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
for(int i=0;i<equations.size();i++){
string u_str=equations[i][0];
string v_str=equations[i][1];
int u=get_id(u_str);
int v=get_id(v_str);
}
int n=name_id.size();
g=vector<vector<double>>(n,vector<double>(n,-1));
for(int i=0;i<equations.size();i++){
string u_str=equations[i][0];
string v_str=equations[i][1];
int u=get_id(u_str);
int v=get_id(v_str);
double val=values[i];
g[u][v]=val;
g[v][u]=1.0/val;
g[u][u]=1;
g[v][v]=1;
}
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j){
continue;
}
if(g[i][k]==-1)
continue;
if(g[k][j]==-1)
continue;
g[i][j]=g[i][k]*g[k][j];
}
}
}
vector<double> ans;
for(int i=0;i<queries.size();i++){
string u_str=queries[i][0];
string v_str=queries[i][1];
if(name_id.count(u_str)==0 || name_id.count(v_str)==0)
ans.push_back(-1);
else{
int u=get_id(u_str);
int v=get_id(v_str);
ans.push_back(g[u][v]);
}
}
return ans;
}
};