990. Satisfiability of Equality Equations

990. 等式方程的可满足性

Posted by bbkgl on June 23, 2020

我梦扁舟浮震泽

雪浪摇空千顷白

其实就是图中计算两点是否连通。。。

在leetcode中碰到的图论题不算多,这次也算一个,应该也可以用并查集来做。

我们可以用提供的所有等式来建立图,然后用所有的不等式验证两点之间的连通性。

取出所有的等式建立图,其中每个顶点就是变量,变量最多26个,如果两个变量之间存在直接的相等关系,则建立无向边。

后面就是验证不等式顶点之间的连通性。。。直接dfs就好啦!

class Solution {
private:
    bool dfs(char s, const char &d, vector<vector<int>> &&g, vector<bool> &vis) {
        for (char next = 'a'; next <= 'z'; next++) {
            if (g[s][next]) {
                if (next == d)
                    return true;
                if (!vis[next]) {
                    vis[next] = true;
                    if (dfs(next, d, std::move(g), vis))
                        return true;
                    vis[next] = false;
                }
            }
        }
        return false;
    }
public:
    bool equationsPossible(vector<string>& equations) {
        vector<pair<char, char>> not_equals;
        vector<vector<int>> g(128, vector<int>(128));
        for (char it = 'a'; it <= 'z'; it++)
            g[it][it] = true;
        for (const string &it : equations) {
            if (it[1] == '=') {
                g[it[0]][it[3]] = true;
                g[it[3]][it[0]] = true;
            } else {
                not_equals.emplace_back(it[0], it[3]);
            }
        }
        vector<bool> vis(128);
        for (const auto it : not_equals) {
            char a = it.first, b = it.second;
            vis[a] = true;
            if (dfs(a, b, std::move(g), vis))
                return false;
            vis[a] = false;

        }
        return true;
    }
};