《五月集训》第26天 并查集

Crazy_DM 2022-05-26 22:21:00

990. 等式方程的可满足性

解题思路:

1. 建立一个容器,初始值为容器下标的自身

2. 遍历容器,把==号的元素放入并查集,每个元素的值为他能够推出的结果。

3. 我们需要通过递归来推出这一个结果,若一个元素的元素不是他自身,那么他已经在一个等式系统了。假设a==d,此时a和d连通,也相当于以a(在数组中映射为0)为下标的元素和d连通,那么我们只需要修改a为下标的元素到d的连通性就好了,如果a下标所指代的元素,其作为下标在数组中对应的值还不是他自己,那么继续递归。

class UnionFind {
public:
    vector<int> hash;
    UnionFind() {
        hash.resize(26);
        iota(hash.begin(), hash.end(), 0);
    }
    
    int find(int id) {
        if(hash[id] == id) return id;
        hash[id] = find(hash[id]);
        return hash[id];
    }
    //在同一个等式系统中
    void unite(int id1, int id2) {
        hash[find(id1)] = find(id2);
    }
};

class Solution {
public:
    bool equationsPossible(vector<string>& equations) {
        UnionFind uf;
        for(auto it: equations) {
            if(it[1] == '=') {
                int id1 = it[0] - 'a';
                int id2 = it[3] - 'a';
                uf.unite(id1, id2);
            }
        }
        for(auto it: equations) {
            if(it[1] == '!') {
                int id1 = it[0] - 'a';
                int id2 = it[3] - 'a';
                if(uf.find(id1) == uf.find(id2)) return false;
            }
        }
        return true;
    }
};

1319. 连通网络的操作次数

解题思路:

跟上一题差不多的思路。

1.将元素放入并查集,如果两个元素已经在并查集的话,那么边的数++

2.遍历得到连通块的个数

3.如果连通块的个数 - 1不大于多余边的数量的话,那么就是可以连接的。

class UnionFind {
public:
    vector<int> hash;
    UnionFind(int n) {
        hash.resize(n);
        iota(hash.begin(), hash.end(), 0);
    }
    int find(int index) {
        if(index == hash[index]) return index; //该电脑目前还没有联通
        hash[index] = find(hash[index]);
        return hash[index];
    }
    bool unite(int index1, int index2) {
        int id1 = find(index1);
        int id2 = find(index2);
        if(id1 == id2) return false;
        hash[id1] = id2;
        return true;
    }
};

class Solution {
public: 
    int makeConnected(int n, vector<vector<int>>& connections) {
        UnionFind uf(n);
        int edge = 0; 
        int count = 0;
        //构建并查集
        for(auto it: connections) {           
            if(!uf.unite(it[0], it[1])) ++edge;
        }

        int arr[100010];
        memset(arr, 0, sizeof(arr));
        for(int i = 0; i < n; ++i) {
            int setID = uf.find(i);
            if(!arr[setID]) {
                arr[setID] = 1;
                ++count;
            } 
        }
        cout << edge << " " << count;
        if(edge >= count - 1) return count - 1;
        else return -1;
    }
};

 

...全文
41 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
2024 年 Uber 乘车分析数据集 这个综合数据集包含 2024 年 Uber 运营的详细拼车数据,提供了有关预订模式、车辆性能、收入流、取消行为和客户满意度指标的丰富见解。 数据集概述 该数据集捕获了多种车辆类型的 148,770 个总预订,并提供了拼车作的完整视图,包括成功乘车、取消、客户行为和财务指标。 主要统计数据: 总预订量:148.77K 次乘车 成功率:65.96%(93K 完成骑行) 取消率:25%(37.43K 取消预订) 客户取消:19.15%(27K 乘车) 司机取消: 7.45% (10.5K 乘车) 数据模式 数据集包含以下列: 列名称 描述 Date 预订日期 Time 预订时间 Booking ID 每次行程预订的唯一标识符 Booking Status 预订状态(已完成、客户取消、司机取消等) Customer ID 客户的唯一标识符 Vehicle Type 车辆类型(Go Mini、Go Sedan、Auto、eBike/Bike、UberXL、Premier Sedan) Pickup Location 游乐设施的起点 Drop Location 乘车目的地 Avg VTAT 司机到达上车地点的平均时间(以分钟为单位) Avg CTAT 从取件到目的地的平均行程时间(以分钟为单位) Cancelled Rides by Customer 客户发起的取消标志 Reason for cancelling by Customer 客户取消原因 Cancelled Rides by Driver 驱动程序启动的取消标志 Driver Cancellation Reason 司机取消原因 Incomplete Rides 未完成骑行标志 Incomplete Rides Reason 不完整骑行的原因

64,185

社区成员

发帖
与我相关
我的任务
社区描述
学习「 算法 」的捷径就是 「 题海战略 」,社区由「 夜深人静写算法 」作者创建,三年ACM经验,校集训队队长,亚洲区域赛金牌,世界总决赛选手。社区提供系统的训练,答疑解惑,面试经验,大厂内推等机会
社区管理员
  • 英雄哪里出来
  • 芝麻粒儿
  • Amy卜bo皮
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

QQ群:480072171

英雄算法交流 8 群

 

试试用AI创作助手写篇文章吧