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; }
此乃求并查集中点到顶点的距离的写法。
方法是一边路径压缩,一边更新距离。