@WangYixu
2018-06-15T11:26:18.000000Z
字数 585
阅读 1001
OI 题解 并查集
注意这个题要存每组的大小,因为题意是要合并到队列末端,而不是j的后面。
int fa[N], d[N], s[N];// 父节点,到父节点的距离,每组的大小int find(int x) {if(fa[x] == x) {return x;}int pre = fa[x];int ft = find(fa[x]);d[x] = d[pre] + d[x];//更新到父节点的距离(此时父节点是根节点)fa[x] = ft;return fa[x];}int main() {cin >> n;char op;int x, y;int ans, fx, fy;//初始化并查集for(int i = 1; i <= N; ++i) {fa[i] = i;s[i] = 1;}for(int i = 1; i <= n; ++i) {cin >> op >> x >> y;fx = find(x);fy = find(y);if(op == 'M') {if(fx != fy) {//合并fa[fx] = fy; //直接合并到并查集根节点后d[fx] += s[fy];//但是距离依旧模拟合并到队列后边s[fy] += s[fx];}} else if(op == 'C') {if(fx != fy) {ans = -1;} else {ans = abs(d[x] - d[y]) - 1;//别忘了减一}printf("%d\n", ans);}}return 0;}
