zoukankan      html  css  js  c++  java
  • 洛谷AT3882

    题目链接https://www.luogu.org/problem/AT3882

    WA了好多,但是依旧不知为何而错

    我的错误代码:

    #include<iostream>
    using namespace std;
    const int maxn = 1e7+5;
    int pre[maxn],dis[maxn];
    ////错误 
    int find(int x){
        while(x!=pre[x]){
            int r = pre[x];
            pre[x] = pre[r];
            dis[x] += dis[r];
            x = r;
        }
        return x;
    }
    
    bool merge(int x,int y,int d){
        int px = find(x);
        int py = find(y);
        if(px==py){
            return d==(dis[y]-dis[x]);
        }
        pre[py] = px ;
        dis[py] = dis[x]+d-dis[y];
        return true;
    }
    void init(){
        for(int i=0;i<maxn;i++){
            pre[i] = i;
        }
    }
    int main()
    {
        init(); 
        int n,m,ans=1;
        cin>>n>>m;
        for(int i=0;i<m;i++){
            int x,y,d;
            cin>>x>>y>>d;
            if(ans){
                ans = merge(x,y,d);
            }
        }
        if(ans){
            cout<<"Yes"<<endl;
        }else{
            cout<<"No"<<endl; 
        }
        return 0;
    }
    View Code

    错误原因:超时,我的路径压缩仅仅压缩了一层,而答案的路径压缩,压缩至根节点

    AC代码

    #include<iostream>
    using namespace std;
    const int maxn = 1e7+5;
    int pre[maxn],dis[maxn];
    int find(int x){
        if(x==pre[x]){
            return x;
        }
        int r = find(pre[x]);
        dis[x] += dis[pre[x]];
        return pre[x] = r;
    } 
    bool merge(int x,int y,int d){
        int px = find(x);
        int py = find(y);
        if(px==py){
            return d==(dis[y]-dis[x]);
        }
        pre[py] = px ;
        dis[py] = dis[x]+d-dis[y];
        return true;
    }
    void init(){
        for(int i=0;i<maxn;i++){
            pre[i] = i;
        }
    }
    int main()
    {
        init(); 
        int n,m,ans=1;
        cin>>n>>m;
        for(int i=0;i<m;i++){
            int x,y,d;
            cin>>x>>y>>d;
            if(ans){
                ans = merge(x,y,d);
            }
        }
        if(ans){
            cout<<"Yes"<<endl;
        }else{
            cout<<"No"<<endl; 
        }
        return 0;
    }
    View Code

     并查集路径压缩:

    int find(int x) {
        if(x == par[x]) return x;
        else return par[x] = find(par[x]);
    } //路径压缩(与返回父亲节点)
    
    void unite(int x, int y) {
        x = find(x);
        y = find(y);
        if(x == y) return ;
        
        if(Rank[x] <= Rank[y]) par[x] = y;
        else par[y] = x;
        if(Rank[x] == Rank[y]) Rank[x]++;
    } //秩优化 与 合并操作
    View Code
  • 相关阅读:
    Hibernate-查询缓存
    Hibernate-二级缓存 sessionFactory
    Hibernate-二级缓存策略
    Hibernate-一级缓存session
    缓存和连接池的区别
    Hibernate-一对多的关系维护
    Hibernate-缓存
    Java基础-jdk动态代理与cglib动态代理区别
    Java基础-CGLIB动态代理
    Java基础-静态代理与动态代理比较
  • 原文地址:https://www.cnblogs.com/Lemon1234/p/11631848.html
Copyright © 2011-2022 走看看