N (≤ 1000) 台電腦,坐標已知,通訊距離 ≤ d。初始均故障。操作:
`O x`:修復電腦 x。
`S x y`:查詢 x、y 是否連通(通過已修復電腦中繼)。
struct Point { int x, y; } p[1005];
bool repaired[1005];
int pre[1005], rnk[1005];
void unite(int x, int y) {
x = find(x); y = find(y);
if (x == y) return;
if (rnk[x] < rnk[y]) swap(x, y);
pre[y] = x;
if (rnk[x] == rnk[y]) rnk[x]++;
}
N (≤ 30000) 學生,M 組。0 號感染。同組傳染,組之間可交叉。求最終感染總人數。
struct UF {
int par[MAXN], rnk[MAXN];
void init(int n) { for(int i=0;i<=n;++i){par[i]=i;rnk[i]=1;} }
int find(int x) { return par[x]==x?x:par[x]=find(par[x]); }
void unite(int x, int y) {
x=find(x); y=find(y); if(x==y) return;
if(rnk[x]
POJ 2236 與 1611 分別展示了並查集在「動態激活節點連通性」與「群組傳遞閉包」中的應用。掌握標準並查集模板,此類問題皆可秒殺。