zoukankan      html  css  js  c++  java
  • 题解 UVA11354 【Bond】

    并查集+按秩合并

    传送门

    大意:给出一张n个点m条边的无向图, 每条边有一个权值,有q个询问, 每次给出两个点s、t,找一条路, 使得路径上的边的最大权值最小。

    我们可以发现,跑最小生成树会跑挂, 那么任意两点, 在生成树上有唯一路径, 而且这条路径上的最大危险值一定最小。 但是每次询问最大复杂度O(n), 那么复杂度高达O(n^2)。 我们知道, 并查集在用了路径压缩之后效率高达O(n), 但是却破坏了树形结构, 所以不能用路径压缩。 然而仅仅靠按秩合并, 复杂度也可低至O(logn)。 因此我们只需按秩合并, 然后询问的时候向根回溯就行了, 复杂度mlogn。

    #include<cstdio>
    #include<cctype>
    #include<algorithm>
    #include<cstring>
    #define R register int
    using namespace std;
    const int N=50010;
    int f[N],rk[N],w[N],wi[N];
    int n,m,t,u,v,cs;
    
    struct edge{
        int u,v,w;
    }e[N];
    
    inline bool cmp(const edge& x,const edge& y) {return x.w<y.w;}
    
    void init() {for(R i=0;i<=n;i++) f[i]=i,rk[i]=0,w[i]=0;}
    
    inline int getf(int i) {return f[i]==i?i:getf(f[i]);}
    
    inline void merge(int u,int v,int wi)
    {
        u=getf(u),v=getf(v);
        if(u==v) return ;
        if(rk[u]<rk[v]) f[u]=v,w[u]=wi;
        else 
        {
            f[v]=u,w[v]=wi;
            if(rk[u]==rk[v]) rk[u]++;
        }
    }
    
    inline int solve(int u,int v)
    {
        for(R i=0;i<=n;i++) wi[i]=0;
        R ans=1,ans1=0;
        while(1) { wi[u]=ans; if(f[u]==u) break; ans=max(ans,w[u]),u=f[u];}
        while(1)
            if(wi[v]) {ans1=max(ans1,wi[v]); break;}
            else if(f[v]==v) break;
            else ans1=max(ans1,w[v]),v=f[v];    
        return ans1;
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&m)==2)
        {
            if(cs++) putchar('
    ');
            init();
            for(R i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
            sort(e+1,e+m+1,cmp);
            for(R i=1;i<=m;i++) merge(e[i].u,e[i].v,e[i].w);
            scanf("%d",&t);
            while(t--)
            {
                scanf("%d%d",&u,&v);
                printf("%d
    ",solve(u,v));
            }    
        }
        return 0;
    }
  • 相关阅读:
    AutoFac
    MEF 基础简介 四
    MEF 基础简介 三
    MEF 基础简介 二
    MEF 基础简介 一
    Ioc原理理解
    .NET里面 abstract class和Interface有什么区别以及用法的展现?
    .NET-ORM框架EF-Code First代码优先
    SQL SERVER PIVOT与用法解释
    SQL Server 中的 NOLOCK 到底是什么意思?
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10381419.html
Copyright © 2011-2022 走看看