ABC304 C-Virus (C++)
検討
人1の感染者から距離D以内にいる人は感染し、そして感染した人の距離D以内にいる人にまた感染します。人1からの深さ優先探索で解きました。
回答
#include <bits/stdc++.h>
using namespace std;
set<int> searched;
void DFS (vector<vector<int>> &branch, int now) {
searched.insert(now);
for (auto b : branch[now]) {
if (searched.count(b)) continue;
DFS(branch, b);
}
}
int main() {
int N, D; cin >> N >> D;
vector<pair<int, int>> point(N);
for (int i = 0; i < N; i++) cin >> point[i].first >> point[i].second;
vector<vector<int>> B(N);
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
int X = point[i].first - point[j].first;
int Y = point[i].second - point[j].second;
if ((X * X + Y * Y) <= (D * D)) {
B[i].emplace_back(j);
B[j].emplace_back(i);
}
}
}
DFS(B, 0);
for (int i = 0; i < N; i++) {
if (searched.count(i)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
実行時間138msでACでした。
この記事が気に入ったらサポートをしてみませんか?