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;
}