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的主要内容,如果未能解决你的问题,请参考以下文章
[BZOJ3027][Ceoi2004]Sweet 容斥+组合数