[NOI2002]銀河英雄傳說 又是並查集!
阿新 • • 發佈:2018-11-07
[NOI2002]銀河英雄傳說
帶權並查集哇嗚嗚嗚
又WAWAWA了
Code
#include <cstdio> #include <algorithm> #include <iostream> #include <cstring> #define ll long long using namespace std; int T, x, y, fa[30007], dis[30007], num[30007]; char s[2]; inline int abss(int x){ return x > 0 ? x : -x; } int find(int x){ if (x != fa[x]){ int k = fa[x]; fa[x] = find(fa[x]); dis[x] += dis[k]; num[x] = num[fa[x]]; } return fa[x]; } int main(){ scanf("%d", &T); for (int i = 1; i <= 30000; ++i) fa[i] = i, num[i] = 1; while (T--){ scanf("%s%d%d", s + 1, &x, &y); int fx = find(x), fy = find(y); if (s[1] == 'M'){ if (fx != fy){ fa[fx] = fy; dis[fx] = dis[fy] + num[fy]; num[fy] += num[fx]; num[fx] = num[fy]; } } else if (fx != fy) printf("-1\n"); else printf("%d\n", abss(dis[x] - dis[y]) - 1); } return 0; }