題目連結:here
PS:第一次自己看英文!!第一次不是百度的題意!!!!
題意:東南亞大地震。。他們電腦全壞了。(我去品質真差,神舟的麼)。然後人要過去修。。需要把電腦都連網,但是硬體限制,所以電腦只能在 d 距離內成功連網。。。第一行輸入電腦個數n和d的值,接著n行,是n個電腦的座標。。然後接下來有操作。。。O代表修第幾台電腦,S代表檢測 兩台電腦是否已經連網。。。注意這裡要用EOF來結束輸出。。。(我在這就卡住了半天。。。)
代碼:
#include <iostream>#include <vector>#include <cstdio>#include <cmath>using namespace std;const int maxn = 1005;struct Node{int x, y;}node[maxn];int fa[maxn];int n, d;vector<int> v;int num;int find(int x){while (x != fa[x]) x = fa[x];return x;}bool judge(int x, int y){int xx = abs(node[x].x-node[y].x), yy = abs(node[x].y-node[y].y);if (xx*xx + yy*yy <= d*d)return true;return false;}void union_set(int x){int fax = find(x);for (int i=0; i<num; i++){int fai = find(v[i]);if (fai != fax && judge(x, v[i]))fa[fai] = fax;}}int main(){while (scanf("%d %d", &n, &d) != EOF){int i;num = 0;v.clear();for (i=1; i<=n; i++){fa[i] = i;scanf("%d %d", &node[i].x, &node[i].y);}getchar();char c;while (scanf("%c", &c) != EOF){if (c == 'O'){int j;scanf("%d", &j);union_set(j);num ++;v.push_back(j);}else if (c == 'S'){int a, b;scanf("%d %d", &a, &b);if (find(a) == find(b)) puts("SUCCESS");else puts("FAIL");}getchar();}}return 0;}