美文网首页
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