papamelon 348. 修復網絡 Wireless Network(挑戰程序設計競賽)

地址 https://www.papamelon.com/problem/348

給定 N 臺電腦,它們分別落在地圖上的座標 xi,yi上。

現在它們都損壞了。我們準備修復其中的某一些電腦。

當一臺電腦修復好了後,它和其他相距不超過距離 d 的正常電腦就可以通信。

通信具有傳遞性:A 和 B 能通信,
B 和 C 能通信,那麼 
A 和 C 就能通信。

現在給定兩種操作:
O p:1≤p≤N,表示修復第 p 臺電腦
S p q:
1≤p,q≤N,測試 ,
p,q 兩臺電腦是否能通信
兩種操作隨機給出,對於每個 S 操作,輸出 SUCCESS 或 FAIL,代表是否能通信。

輸入
第一行兩個整數 
N(1≤N≤1001),d(0≤d≤20000)
接下來 N 行,每行是一臺電腦的座標 
接下來若干行,是隨機給出的操作,以 EOF 結束,操作的輸入格式如上所述
樣例 1
輸入
4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4
輸出
FAIL
SUCCESS

並查集
每修好一臺電腦 與周邊電腦計算座標 如果在範圍內,合併兩臺電腦的編號。
注意判斷記錄 可以不使用開根號計算。

#include <iostream>

using namespace std;

const int N = 1010;
int f[N];
pair<int, int> axis[N];
int repair[N];

void init() {
    for (int i = 0; i < N; i++) {
        f[i] = i;
    }
}

int find(int x) {
    if (f[x] != x) {
        f[x] = find(f[x]);
    }
    return f[x];
}

void merge(int a, int b) {
    f[find(a)] = find(b);
}

int  calcDis(int a, int b) {
    int res =  (axis[a].first - axis[b].first) * (axis[a].first - axis[b].first) +
        (axis[a].second - axis[b].second) * (axis[a].second - axis[b].second);
    return res;
}

int n, d;
int main() {
    init();
    cin >> n >> d;
    for (int i = 1; i <= n; i++) {
        int x, y;
        cin >> x >> y;
        axis[i] = { x,y };
    }
    string op;
    while (cin >> op) {
        if (op == "O") {
            int t;
            cin >> t;
            repair[t] = 1;
            for (int i = 1; i <= n; i++) {
                if (find(i) == find(t)) continue;
                if (repair[i]==1 && calcDis(i, t) <= ((long long)1 * d * d) ) {
                    merge(i, t);
                }
            }
        }
        else {
            int a, b; cin >> a >> b;
            if (find(a) == find(b)) {
                cout << "SUCCESS" << endl;
            }
            else {
                cout << "FAIL" << endl;
            }
        }
    }

    return 0;
}

視頻題解空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章