Equations are given in the format A / B = k
, where A
and B
are variables represented as strings, and k
is a real number (floating point number). Given some queries, return the answers. If the answer does not exist, return -1.0
.
Example:
Given a / b = 2.0, b / c = 3.0.
queries are: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? .
return [6.0, 0.5, -1.0, 1.0, -1.0 ].
The input is: vector<pair<string, string>> equations, vector<double>& values, vector<pair<string, string>> queries
, where equations.size() == values.size()
, and the values are positive. This represents the equations. Return vector<double>
.
According to the example above:
equations = [ ["a", "b"], ["b", "c"] ], values = [2.0, 3.0], queries = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ].
The input is always valid. You may assume that evaluating the queries will result in no division by zero and there is no contradiction.
转化为有向图解决,单个字母对应图中顶点,比例关系对应边的权重。
例如给定关系: a/b=2.0,b/c=3.0,a/d=5.0,b/e=0.5,f/b=4.0 ,根据关系构建的图如下
每次求对应比例关系的时候就从起始点开始dfs,把路径上所有边的权重(顺着边的方向为权重,逆着边的方向为1/权重)做乘积即可。
public class Solution {
double curWeight;
public double[] calcEquation(String[][] equations, double[] values,String[][] queries)
{
int len=equations.length;
HashMap<String, ArrayList<EvaNode>> hashmap=new HashMap<>();
for(int i=0;i<len;i++)
{
String start=equations[i][0];
String end=equations[i][1];
double value=values[i];
if(!hashmap.containsKey(start))
hashmap.put(start, new ArrayList<EvaNode>());
if(!hashmap.containsKey(end))
hashmap.put(end, new ArrayList<EvaNode>());
hashmap.get(start).add(new EvaNode(end, value));
hashmap.get(end).add(new EvaNode(start, 1/value));
}
int retlen=queries.length;
double[] retarr=new double[retlen];
for(int i=0;i<retlen;i++)
{
String s=queries[i][0];
String e=queries[i][1];
if(!hashmap.containsKey(s)||!hashmap.containsKey(e))
{
retarr[i]=-1.0;
continue;
}
if(s.hashCode()==e.hashCode())
{
retarr[i]=1.0;
continue;
}
curWeight=1.0;
if(dfs(s, e, hashmap,""))
retarr[i]=curWeight;
else {
retarr[i]=-1;
}
}
return retarr;
}
public boolean dfs(String s,String e,HashMap<String, ArrayList<EvaNode>> hashmap,String last)
{
if(s.hashCode()==e.hashCode())
return true;
for(EvaNode node :hashmap.get(s))
if(node.s.hashCode()!=last.hashCode())
{
curWeight*=node.weight;
if(dfs(node.s, e, hashmap,s))
return true;
curWeight/=node.weight;
}
return false;
}
}
class EvaNode
{
String s;
double weight;
public EvaNode(String s,double weight)
{
this.s=s;
this.weight=weight;
// TODO Auto-generated constructor stub
}
}