1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| class UF { public: UF(int _n) :count(_n), parent(_n, -1) {} int getCount() { return count; } bool isConnected(int a, int b) { int class1 = find(a); int class2 = find(b); return class1 == class2; } void unite(int a, int b) { int class1 = find(a); int class2 = find(b); if (class1 == class2) return; if (parent[class1] < parent[class2]) { parent[class1] += parent[class2]; parent[class2] = class1; } else { parent[class2] += parent[class1]; parent[class1] = class2; } --count; }
private: int find(int pos) { if (parent[pos] < 0) return pos; return parent[pos] = find(parent[pos]); }
int count; vector<int> parent; };
class Solution { public: bool equationsPossible(vector<string>& equations) { UF a(26); for (int i = 0; i < equations.size(); i++) { if (equations[i][1] == '=') { a.unite(equations[i][0] - 97, equations[i][3] - 97); } } for (int i = 0; i < equations.size(); i++) { if (equations[i][1] == '!') { if (a.isConnected(equations[i][0] - 97, equations[i][3] - 97)) return false; } } return true; } };
|