Leetcode 周赛#220 D. 检查边长度限制的路径是否存在 (并查集+离线)

29 篇文章 0 订阅
12 篇文章 0 订阅

Description
在这里插入图片描述
Solution
将询问和边集按照边权从小到大排序后, 每次将比当前询问的lim小的边加入并查集中, 再判断此时两点是否连通即可

Code

class Solution {
public:
    #define maxn 100005
    int fa[maxn];
    int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
    struct node{
        int u,v,lim;
        int id;
        inline bool operator <(const node&it) const{
            return lim < it.lim;
        }
    };
    vector<node>q, edge;
    bool ans[maxn];
    vector<bool>res;
    inline void unionset(int u,int v) {
        int f1 = find(u), f2 = find(v);
        if(f1 == f2) return ;
        fa[f1] = f2;
    }
    void init(int n) {
        res.clear();
        q.clear(), edge.clear();
        for(int i = 0;i < n;++i) fa[i] = i;
    }
    vector<bool> distanceLimitedPathsExist(int n, vector<vector<int>>& edgeList, vector<vector<int>>& queries) {
        init(n);
        for(int i = 0;i < queries.size();++i) {
            q.push_back((node){queries[i][0], queries[i][1], queries[i][2],i});
        }
        for(int i = 0;i < edgeList.size();++i) {
            edge.push_back((node){edgeList[i][0], edgeList[i][1], edgeList[i][2],i});
        }
        sort(q.begin(), q.end());
        sort(edge.begin(), edge.end());
        int i = 0, sz1 = q.size(), sz2 = edge.size();
        for(auto now : q) {
            int lim = now.lim, id = now.id;
            while(i < sz2 && edge[i].lim < lim) {
                int u = edge[i].u, v = edge[i].v;
                unionset(u,v);++i;
            }
            if(find(now.u) != find(now.v)) {
                ans[id] = false;
            } else ans[id] = true;
        }
        for(int i = 0;i < sz1;++i) {
            res.push_back(ans[i]);
        }return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值