D题 | 小L的扩展
解题思路:
本质上是多源bfs题,不过要用优先队列,蓝色的点要么推迟时间,要么不产生任何影响。
示例代码:
typedef array<int, 3> pi3;
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
void solve() {
int n, m, a, b;
cin >> n >> m >> a >> b;
vector<vector<bool>> vis(n, vector<bool>(m, 0));
vector<vi> blue(n, vi(m, 0));
priority_queue< pi3, vector<pi3>, greater<pi3> > pq;
int x, y, z, ans = 0;
for (int i = 0; i < a; ++i) {
cin >> x >> y;
pq.push({0, --x, --y});
vis[x][y] = 1;
}
for (int i = 0; i < b; ++i) {
cin >> x >> y >> z;
blue[--x][--y] = z;
}
while (!pq.empty()) {
pi3 p = pq.top();
pq.pop();
ans = p[0];
for (int k = 0; k < 4; ++k) {
int nx = p[1] + dx[k];
int ny = p[2] + dy[k];
if (nx < 0 || nx >= n || ny < 0 || ny >= m || vis[nx][ny])continue;
vis[nx][ny] = 1;
pq.push({max(p[0] + 1, blue[nx][ny]), nx, ny});
}
}
cout << ans;
}

京公网安备 11010502036488号