AcWing 238. 銀河英雄傳說
阿新 • • 發佈:2022-04-12
姊妹題 \(POJ-1988-Cube Stacking\)
#include <bits/stdc++.h> using namespace std; const int N = 30010; int p[N]; //並查集陣列 int sz[N]; //家族中人員數量 int d[N]; //每個點到根節點的距離 //帶邊權更新並查集模板 int find(int x) { if (x == p[x]) return x; int root = find(p[x]); d[x] += d[p[x]]; return p[x] = root; } int main() { int m; cin >> m; //初始化並查集,每個人是自己的族長,並且每個家族目前只有1個人 for (int i = 1; i < N; i++) p[i] = i, sz[i] = 1, d[i] = 0; for (int i = 0; i < m; i++) { char op; int a, b; cin >> op >> a >> b; int pa = find(a), pb = find(b); if (op == 'M') { d[pa] = sz[pb]; //記錄pa到pb的距離,這和本題的擺法直接相關 sz[pb] += sz[pa]; //家族人數增加sz[pa] p[pa] = pb; // pa加入pb家族 } else { //如果第 i 號戰艦與第 j 號戰艦當前不在同一列上,則輸出 −1。 if (pa != pb) puts("-1"); else //如果兩者相同,那麼返回0 printf("%d\n", max(0, abs(d[a] - d[b]) - 1)); //問間隔還需要減1 } } return 0; }