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
", 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;
}

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

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

原文地址:https://www.cnblogs.com/yohanlong/p/7779083.html