zoukankan      html  css  js  c++  java
  • LA 并查集路径压缩

    题目大意:有n个节点,初始时每个节点的父亲节点都不存在。有两种操作

    I u v:把点节点u的父亲节点设为v,距离为|u-v|除以1000的余数。输入保证执行指令前u没有父亲节点。

    E u:询问u到根节点的距离。

    分析:并查集加路径压缩。

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    
    const int maxn=20010;
    int f[maxn],d[maxn];
    
    int findset(int x)
    {
        if(f[x] !=x)
        {
            int root=findset(f[x]);
            d[x]+=d[f[x]];
            return f[x]=root;
        }
        else return x;
    }
    
    int main()
    {
        int T,i,n,u,v;
        char c[5];
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(i=1;i<=n;i++){ f[i]=i;d[i]=0;}
            while(scanf("%s",c) && c[0]!='O')
            {  
                if(c[0] == 'E')
                {
                    scanf("%d",&u);
                    findset(u);
                    printf("%d
    ",d[u]);
                }
                if(c[0] == 'I')
                {
                    scanf("%d %d",&u,&v);
                    f[u]=v;d[u]=abs(u-v)%1000;
                }
              
            }
        }
        return 0;
    }
  • 相关阅读:
    OpenJudge 6042 雇佣兵
    POJ 1741 树上 点的 分治
    Codevs 1695 Windows2013
    复制书稿
    乘积最大
    编辑距离问题
    石子合并
    最大正方形子矩阵
    选菜
    混合背包
  • 原文地址:https://www.cnblogs.com/xiong-/p/3565372.html
Copyright © 2011-2022 走看看