uva3027

Posted yohanlong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva3027相关的知识,希望对你有一定的参考价值。

太弱了之前没写过几次并查集合并。

所以这道题拎出来写写。

#include <cstdio>
#include <algorithm>

using namespace std;

const int maxn = 20005;

int t, n;

int pa[maxn], d[maxn];

int find(int x)
{
    if (pa[x] != x)
    {
        int root = find(pa[x]);//此时pa[x]到root的信息已经维护好了。
        d[x] += d[pa[x]];//再把x到pa[x]的信息也维护上。
        return pa[x] = root;
    } else return x;
}

int main()
{
//    freopen("uva3027.in","r",stdin);
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            pa[i] = i;
            d[i] = 0;
        }
        char cmd[9];
        while (scanf("%s", cmd) && cmd[0] != O)
        {
            if (cmd[0] == E)
            {
                int u;
                scanf("%d", &u);
                find(u);
                printf("%d\n", d[u]);
            }
            else if (cmd[0] == I)
            {
                int x, y;
                scanf("%d%d", &x, &y);
                pa[x] = y;
                d[x] = abs(x - y) % 1000;
            }
        }
    }
    return 0;
}

此乃求并查集中点到顶点的距离的写法。

方法是一边路径压缩,一边更新距离。

以上是关于uva3027的主要内容,如果未能解决你的问题,请参考以下文章

CodeVS 3027 线段覆盖2

Codevs 3027 线段覆盖 2

LA 3027 合作网络

[BZOJ3027][Ceoi2004]Sweet 容斥+组合数

[2016-03-19][UVALive][3027][Corporative Network]

bzoj 3027: [Ceoi2004]Sweet (生成函数)