zoukankan      html  css  js  c++  java
  • [LeetCode] 990. 等式方程的可满足性

          使用并查集算法,核心思想:将 equations 中的算式根据 == 和 != 分成两部分,先处理 == 算式,使得他们通过相等关系各自勾结成门派;然后处理 != 算式,检查不等关系是否破坏了相等关系的连通性。

    /*
     * @lc app=leetcode.cn id=990 lang=cpp
     *
     * [990] 等式方程的可满足性
     */
    
    // @lc code=start
    #include<bits/stdc++.h>
    using namespace std;
    class UF
    {
    private:
        int count;//连通的个数
        vector<int> parent;//保存节点的父节点
        vector<int> size;//保存节点所在连通分量的重量(节点数)
    public:
        // 构造函数初始化
        UF(int n)
        {
            count = n;
            parent.resize(n);
            size.resize(n);
            for(int i = 0; i < n; i++)
            {
                parent[i] =i;
                size[i] = 1;
            }
        }
        // 将节点p 和 节点 q 连通
        void Union(int p, int q)
        {
            int rootP = find(p);
            int rootQ = find(q);
            if(rootP == rootQ)
                return;
            
            if(size[rootP] > size[rootQ])
            {
                parent[rootQ] = rootP;
                size[rootP] += size[rootQ];
            }
            else
            {
                parent[rootP] = rootQ;
                size[rootQ] += size[rootP];
            }
            count--;//连通个数 -1
        }
        //判断节点p 和 节点 q 是否连通
        bool connected(int p, int q)
        {
            int rootP = find(p);
            int rootQ = find(q);
            return rootP==rootQ;
        }
        //返回当前连通个数
        int count_num()
        {
            return count;
        }
    private:
        // 寻找 x 节点的根节点
        int find(int x)
        {
            while(parent[x] != x)
            {
                //查找根节点的同时,对树进行路径压缩,
                parent[x] = parent[parent[x]];
                x = parent[x];
            }
            return x;
        }
    };
    class Solution {
    public:
        bool equationsPossible(vector<string>& equations)
        {
            UF* uf = new UF(26);
            vector<string> ineuqal;
            ineuqal.clear();
            const int eq_size = equations.size();
            for(int i =0;i<eq_size;++i)
            {
                string equation = equations[i];
                if(equation[1]=='=')
                {
                    int left_char_index = equation[0]-'a';
                    int right_char_index = equation[3]-'a';
                    uf->Union(left_char_index,right_char_index);
    
                }
                else{
                    ineuqal.push_back(equation);
                }
            }
            const int in_eq_size = ineuqal.size();
             for(int j =0;j<in_eq_size;++j)
             {
                 string ineuqalstr = ineuqal[j];
                 int left_inequal = ineuqalstr[0]-'a';
                 int right_inequal = ineuqalstr[3]-'a';
                 if(uf->connected(left_inequal,right_inequal)){
                    // delete uf;
                     return false;
                 }  
             }
             //delete uf;
             return true;
        }
    };
    // @lc code=end
  • 相关阅读:
    linux自动清理30天之前的文件
    Oracle树查询及相关函数
    jackson循环引用导致序列化stackOverFlow的解决
    java核心技术36讲笔记
    Quartz学习
    Quartz学习
    java核心技术36讲
    git常用命令
    CTCall简介(后续会继续补充)
    自定义导航栏,隐藏导航栏底部的灰色线条
  • 原文地址:https://www.cnblogs.com/wangxf2019/p/12846919.html
Copyright © 2011-2022 走看看