ABC 299
Table of Contents
https://atcoder.jp/contests/abc299
A. Treasure Chest
https://atcoder.jp/contests/abc299/tasks/abc299_a
B. Trick Taking
https://atcoder.jp/contests/abc299/tasks/abc299_b
C. Dango
https://atcoder.jp/contests/abc299/tasks/abc299_c
D. Find by Query
https://atcoder.jp/contests/abc299/tasks/abc299_d
E. Nearest Black Vertex
https://atcoder.jp/contests/abc299/tasks/abc299_e
BFS を使って、各頂点間の最短距離をまずは求める。
一旦全ての頂点を黒く塗る。 次に、各頂点 p から d より近いところにある黒を白く塗り直す。 その後、各頂点について条件を満たす黒い頂点があるか調べる。
void solve() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
vvint graph(N);
rep(i, M) {
int u, v;
cin >> u >> v;
u--, v--;
graph[u].push_back(v);
graph[v].push_back(u);
}
int K;
cin >> K;
vector<pair<int, int>> ps;
rep(i, K) {
int p, d;
cin >> p >> d;
p--;
ps.push_back({p, d});
}
auto short_path = [](vvint& graph, int start) -> vint {
int N = graph.size();
vint dist(N, INF);
dist[start] = 0;
// cost, position
using P = pair<ll, int>;
deque<P> deq;
deq.push_back({0, start});
while (deq.size()) {
auto [cost, now] = deq.front();
deq.pop_front();
if (dist[now] < cost)
continue;
for (int nx : graph[now]) {
if (dist[nx] <= cost + 1)
continue;
dist[nx] = cost + 1;
deq.push_back({cost + 1, nx});
}
}
return dist;
};
vvint dists(N);
rep(i, N) {
dists[i] = short_path(graph, i);
}
// 一旦全ての頂点を黒く塗る
vint black(N, 1);
// 頂点 p から d より近いところにある黒を白く塗り直す
for (auto [p, d] : ps) {
rep(i, N) {
if (dists[p][i] < d)
black[i] = 0;
}
}
// 各頂点について条件を満たす黒い頂点があるか調べる
for (auto [p, d] : ps) {
int ok = 0;
rep(i, N) {
if (dists[p][i] == d && black[i])
ok = 1;
}
if (!ok) {
yesno(false);
return;
}
}
yesno(true);
for (int x : black)
cout << x;
cout << endl;
}
F. Square Subsequence
https://atcoder.jp/contests/abc299/tasks/abc299_f
G. Minimum Permutation
https://atcoder.jp/contests/abc299/tasks/abc299_g