標籤:else containe space size ide ext action print text
題目連結:
cid=66964#problem/A">[kuangbin帶你飛]專題五 並查集 A - Wireless Network
題意
有n台損壞的電腦,現要將其逐台修複,且使其相互恢複通訊功能。若兩台電腦能相互連信。則有兩種情況。一是他們之間的距離小於d。二是他們能夠藉助都可到達的第三台已修複的電腦。給出全部電腦的座標位置,對其進行兩種可能的操作,O x表示修複第x台。S x y表示推斷x y之間是否能通訊,若能輸出SUCCESS,否則輸出FALL。
思路
用並查集來儲存電腦互相的連通情況。
每次修好電腦後,將它能夠通訊的電腦(距離滿足且已修好)與它進行連通。
代碼
#include<iostream>#include<stdio.h>#include<cstring>#include<cstdlib>#include<vector>#include<algorithm>#define LL long longusing namespace std;const int N = 1009;int x[N], y[N], fa[N];bool p[N];vector<int> v[N];int find(int x){ if(fa[x] == x) return x; return fa[x] = find(fa[x]);}int main(){ int n, d; char s[2]; scanf("%d%d", &n, &d); for(int i=1; i<=n; i++) { scanf("%d%d", &x[i], &y[i]); fa[i] = i; } for(int i=1; i<=n; i++) for(int j=i+1; j<=n; j++) { if(((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])) <= d*d) { v[j].push_back(i); v[i].push_back(j); } } while(~scanf("%s", s)) { int a, b; if(s[0] == ‘O‘) { scanf("%d", &a); p[a] = true; for(int i=0; i<v[a].size(); i++) if(p[v[a][i]]) { b = find(v[a][i]); fa[b] = a; } } else { scanf("%d%d", &a, &b); int ta = find(a); int tb = find(b); if(ta == tb) printf("SUCCESS\n"); else printf("FAIL\n"); } } return 0;}
POJ 2236 Wireless Network(並查集)