这里思路很好像,将字母之间的除法关系用有向图连接,问题转换为图上任意两点的最短路径问题,由于输入总是有效的,因此可以用Floyd直接求出整个图的最短路径矩阵,然后再问询阶段直接给出答案。
也可以再问询阶段,用并查集或者DFS/BFS的方法给出答案。
用并查集还有维护权重信息,有一些难度。
这里还有一个技巧,就是用set和hashmap来建立字母图,这样非常方便有效。
class Solution {
public:
vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
unordered_set<string> vertex;
unordered_map<string,unordered_map<string,double>> d;
for(int i = 0;i<equations.size();i++){
auto a = equations[i][0];
auto b = equations[i][1];
vertex.insert(a);
vertex.insert(b);
d[a][b] = values[i];
d[b][a] = 1.0/values[i];
}
for(auto k:vertex){
for(auto i:vertex){
for(auto j:vertex){
if(d[i][k]&&d[k][j]){
d[i][j] = d[i][k]*d[k][j];
}
}
}
}
vector<double> res;
for(auto query:queries){
auto a = query[0];
auto b = query[1];
if(d[a][b]) res.push_back(d[a][b]);
else res.push_back(-1);
}
return res;
}
};