399. Evaluate Division

来源:互联网 发布:ovs linux网桥 编辑:程序博客网 时间:2024/06/05 16:10

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


0 0