多源BFS:刺杀大使

题目:P1902 刺杀大使 - 洛谷

先看题目数据范围,不是很大。

这道题求最大值最小化 ,我们应该想到用二分。

  • 把第一行的每个数加入队列(多源BFS)
  • 找出伤害值不超过mid的情况,能否一条到达第n行的路线
  • 只要有一条通道能成功能通向终点,那就返回true
cpp 复制代码
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>

using namespace std;
const int N = 1010;

int n, m;
int a[N][N];
bool st[N][N];
int r = 0;
int l = 0;

int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};

typedef pair<int, int> PII;

bool bfs(int mid)
{
	queue<PII> q;
	memset(st, 0, sizeof(st));
	if (n == 1) return true;
	
	for (int i = 1; i <= m; i++)
	{
		q.push({1, i});
	}
	
	while(q.size())
	{
		auto t = q.front(); q.pop();
		int x1 = t.first, y1 = t.second;
		for (int i = 0; i < 4; i++)
		{
			int x2 = x1+dx[i], y2 = y1 + dy[i];
			
			if (x2 < 1 || x2 > n || y2 < 1 || y2 > m || a[x2][y2] > mid || st[x2][y2]) continue;
			
			st[x2][y2] = true;
			if (x2 == n) return true;
			q.push({x2, y2});
		}
	}
	
	return false;
}

int main()
{
	cin >> n >> m;
	
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cin >> a[i][j];
			r = max(r, a[i][j]);
		}
	}
	
	while(l < r)
	{
		int mid = (l+r)/2;
		
		if (bfs(mid)) r = mid; //最大值最小化 
		else l = mid+1;
	} 
	
	cout << l << endl;
	
	return 0;
}
相关推荐
软件派8 小时前
生产动态数据智能风控:阈值判别、趋势预测、异常识别算法工程落地实战
前端·数据库·算法
ZhengEnCi15 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
吞下星星的少年·-·19 小时前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
aichitang202419 小时前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
二本咕咕-机械转码20 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
-银雾鸢尾-20 小时前
两数之和-C++实现
c++·算法
j7~20 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
倍利福猎头公司官方账号20 小时前
大企业HR如何向猎头公司清晰传达AI岗位的技术需求?
人工智能·算法·机器人·求职招聘·业界资讯
揽星河..21 小时前
【C++】类和对象
c++·算法