Advertisement
rujain

Evaluate Division

Jan 30th, 2025 (edited)
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. struct Node {
  2.     string variable;
  3.     double value;
  4. };
  5.  
  6. class UnionFind {
  7.     map<string, int> rank;
  8.     map<string, Node> parent;
  9.  
  10. public:
  11.     UnionFind(vector<vector<string>>& equations) {
  12.         for(auto i : equations) {
  13.             parent[i[0]] = {i[0], 1};
  14.             parent[i[1]] = {i[1], 1};
  15.         }
  16.     }
  17.  
  18.     Node findParent(string x) {
  19.         if(parent[x].variable.empty()) {
  20.             return parent[x];
  21.         }
  22.         if(x != parent[x].variable) {
  23.             Node p = findParent(parent[x].variable);
  24.             parent[x].variable = p.variable;
  25.             parent[x].value *= p.value;
  26.         }
  27.         return parent[x];
  28.     }
  29.  
  30.     void unionSet(string u, string v, double value) {
  31.         Node ulp_u = findParent(u);
  32.         Node ulp_v = findParent(v);
  33.  
  34.         if(ulp_u.variable == ulp_v.variable) return;
  35.         if(rank[ulp_u.variable] < rank[ulp_v.variable]) {
  36.             parent[ulp_u.variable].variable = ulp_v.variable;
  37.             parent[ulp_u.variable].value = ulp_v.value / ulp_u.value * value;
  38.         } else if(rank[ulp_u.variable] > rank[ulp_v.variable]) {
  39.             parent[ulp_v.variable].variable = ulp_u.variable;
  40.             parent[ulp_v.variable].value = ulp_u.value / ulp_v.value / value;
  41.         } else {
  42.             parent[ulp_v.variable].variable = ulp_u.variable;
  43.             parent[ulp_v.variable].value = ulp_u.value / ulp_v.value / value;
  44.             rank[ulp_u.variable]++;
  45.         }
  46.     }
  47. };
  48.  
  49. class Solution {
  50. public:
  51.     vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
  52.         int n = equations.size();
  53.        
  54.         UnionFind uf(equations);
  55.         // union
  56.         for(int i = 0; i < n; i++) {
  57.             uf.unionSet(equations[i][0], equations[i][1], values[i]);
  58.         }
  59.  
  60.         // evaluate
  61.         vector<double> ans;
  62.         int m = queries.size();
  63.         for(int i = 0; i < m; i++) {
  64.             string x = queries[i][0];
  65.             string y = queries[i][1];
  66.  
  67.             auto par_x = uf.findParent(x);
  68.             auto par_y = uf.findParent(y);
  69.  
  70.             if(par_x.variable.empty() || par_y.variable.empty() ||
  71.                 par_x.variable != par_y.variable) {
  72.                 ans.push_back(-1);
  73.             } else {
  74.                 ans.push_back(par_x.value / par_y.value);
  75.             }
  76.         }
  77.  
  78.         return ans;
  79.     }
  80. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement