美文网首页
5632. 检查边长度限制的路径是否存在(图论:并查集)

5632. 检查边长度限制的路径是否存在(图论:并查集)

作者: 来到了没有知识的荒原 | 来源:发表于2020-12-20 14:50 被阅读0次

5632. 检查边长度限制的路径是否存在

排序+并查集

把边从小到大排序
queries询问的边从小到大排序
这样每次只有在每次询问的时候加边,这样加边只加了一次。

class Solution {
public:
    vector<int>p;

    int find(int x){
        if(p[x]!=x)p[x]=find(p[x]);
        return p[x];
    }

    void merge(int a,int b){
        int ra=find(a),rb=find(b);
        p[ra]=rb;
    }

    vector<bool> distanceLimitedPathsExist(int n, vector<vector<int>>& es, vector<vector<int>>& qs) {
        p.resize(n);
        for(int i=0;i<n;i++)p[i]=i;
        for(int i=0;i<qs.size();i++){
            qs[i].push_back(i);
        }
        sort(es.begin(),es.end(),[](const vector<int>&a,const vector<int>&b){
            return a[2]<b[2];
        });
        sort(qs.begin(),qs.end(),[](const vector<int>&a,const vector<int>&b){
            return a[2]<b[2];
        });
        vector<bool>res(qs.size());

        int pos=0;
        for(int i=0;i<qs.size();i++){
            while(pos<es.size() && es[pos][2]<qs[i][2]){
                int a=es[pos][0],b=es[pos][1];
                merge(a,b);
                pos++;
            }
            int ra=find(qs[i][0]),rb=find(qs[i][1]);
            res[qs[i][3]]=ra==rb;
        }
        return res;
    }
};

相关文章

网友评论

      本文标题:5632. 检查边长度限制的路径是否存在(图论:并查集)

      本文链接:https://www.haomeiwen.com/subject/ztkknktx.html