原理

一般情况下,我们使用的是单源BFS来处理只有一个起点的情况,对于有多个起点,便是用多源BFS,仅需将多个起点提前塞进队列就行

例题

P1332 血色先锋队

题目背景

巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好聚集了起来,以抵抗天灾军团的围剿。可怕的是,他们之中有人感染上了亡灵瘟疫,如果不设法阻止瘟疫的扩散,很快就会遭到灭顶之灾。大领主阿比迪斯已经开始调查瘟疫的源头。原来是血色先锋军的内部出现了叛徒,这个叛徒已经投靠了天灾军团,想要将整个血色先锋军全部转化为天灾军团!无需惊讶,你就是那个叛徒。在你的行踪败露之前,要尽快完成巫妖王交给你的任务。

题目描述

军团是一个 n 行 m 列的矩阵,每个单元是一个血色先锋军的成员。感染瘟疫的人,每过一个小时,就会向四周扩散瘟疫,直到所有人全部感染上瘟疫。你已经掌握了感染源的位置,任务是算出血色先锋军的领主们感染瘟疫的时间,并且将它报告给巫妖王,以便对血色先锋军进行一轮有针对性的围剿。

输入格式

第 1 行:四个整数 n,m,a,b,表示军团矩阵有 n 行 m 列。有 a 个感染源,b 为血色敢死队中领主的数量。

接下来 aa 行:每行有两个整数 x,y,表示感染源在第 x 行第 y 列。

接下来 bb 行:每行有两个整数 x,y,表示领主的位置在第 x 行第 y 列。

输出格式

第 1 至 b 行:每行一个整数,表示这个领主感染瘟疫的时间,输出顺序与输入顺序一致。如果某个人的位置在感染源,那么他感染瘟疫的时间为 0。

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
typedef unsigned long long ull;
#define FAST ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, n, a) for (int i = n; i >= a; i--)
#define mem(a,x) memset(a,x,sizeof(a))
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define int long long
const int mod1 = 1e9 + 7, mod2 = 998244353;
const int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
const int N = 5e2 + 5, M = 2e5 + 5;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int n, m, a, b;
struct Army{int x, y;
} c[M];
int d[N][N];
bool vis[N][N];
queue<PII> q;
void init(){for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){d[i][j] = -1;}}
}
void bfs(){while(q.size()){auto t = q.front();q.pop();for (int i = 0; i < 4; i++){int x = t.fi + dx[i], y = t.se + dy[i];if(x >= 1 && x <= n && y >= 1 && y <= m && !vis[x][y]){d[x][y] = d[t.fi][t.se] + 1;vis[x][y] = true;q.push({x, y});}}}return;
}
signed main(){FAST;cin >> n >> m >> a >> b;init();for (int i = 1; i <= a; i++){int x, y;cin >> x >> y;q.push({x, y});d[x][y] = 0;vis[x][y] = true;}for (int i = 1; i <= b; i++){cin >> c[i].x >> c[i].y;}bfs();for (int i = 1; i <= b; i++){cout << d[c[i].x][c[i].y] << endl;}return 0;
}

acm总结——多源BFS相关推荐

  1. 算法提高课-搜索-多源BFS-AcWing 173. 矩阵距离:bfs、多源bfs

    题目分析 来源:acwing 分析: 0表示住户,1表示超市,这些超市是等价的.求每个住户到达超市的最近距离. 多源bfs在做的时候,把所有超市的距离都初始化为0,然后压入队列. 这里用的是数组模拟队 ...

  2. CSP认证201409-4 最优配餐[C++题解]:bfs、多源bfs、最短路、图论

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 有很多起点S,同时有很多终点T,求每个终点到起点中最短的路,只要是到达其中一个起点就行.所以这是一个多源bfs的题目. ac代码 # ...

  3. LeetCode 286. 墙与门 多源BFS和DFS

    思路1: DFS,对于每个门进行一次DFS搜索,记录每个位置对每个门的距离,当有更小距离的门时更新这个数值 public void WallsAndGates(int[][] rooms) {for ...

  4. codeforces1301 F. Super Jaber(多源bfs+枚举)

    F. Super Jaber 最终答案的方案可以分为2种: 不使用传送,即曼哈顿距离. 从起点S到最近(步数最少)的颜色为C的格子x,传送到离终点T最近的颜色也为c的格子y,再走到T(从S到x以及y到 ...

  5. New Online Judge P1128-绝地求生(多源bfs)

    P1128-绝地求生 传送门 题目描述: 小H所在的地方有毒气扩散,现在他必须赶去安全区. 他所在的地方可以用一个N∗M的地图表示..表示空地,人和毒气都可以经过*表示毒气的地方(可能有多个地方有毒气 ...

  6. 第 254 场力扣周赛(KMP、贪心、快速幂、二分+多源bfs、并查集 + 时光倒流)

    第 254 场力扣周赛 稀里糊涂双眼双眼惺忪的做了三道,错了4次...还是600来名 5843. 作为子字符串出现在单词中的字符串数目 题目描述 给你一个字符串数组 patterns 和一个字符串 w ...

  7. L. Spicy Restaurant(多源BFS+递推)

    L. Spicy Restaurant 题目链接 https://codeforces.com/gym/103117/problem/L 思路: 1.考虑到1≤ai≤100 ,一开始直接使用BFS,对 ...

  8. Spicy Restaurant (暴力多源bfs)

    Link 题意: 有n个城市,每个城市有个辣度,给你个图,有q次询问求某个点开始,忍耐度为w,求最近辣度<=w的最短路,边权为1. q<=5e5n<=1e5m<=1e5wi,w ...

  9. 多源bfs Spicy Restaurant

    Spicy Restaurant 多源bfs+一个递推 做了好多题,这道题算做的比较少的题. #include <bits/stdc++.h>using namespace std; in ...

最新文章

  1. 图的遍历——DFS(邻接矩阵)
  2. Jenkins + Git + Maven + tomcat集成环境搭建
  3. 自定义TabHost,TabWidget样式 .
  4. JavaWeb 入门篇(1)Maven创建Web项目 Idea配置tomcat
  5. 历史性胜利!纽约曼哈顿充电站数量超过加油站
  6. 仿新浪微博滚动,无文字渐显功能
  7. 计算机系统高级设置在哪里,Win7系统高级设置在哪里
  8. winformbutton边框怎么改_C#(winform)为button添加背景图片,并去掉各种边框
  9. 【数据结构】树状数组笔记
  10. mongodb update操作
  11. MySql 数据类型 - 小数型
  12. linux-glibc升级到2.15版本
  13. php开发数独,数独解题小程序实现代码
  14. hp39gs运行C语言,HP39GS 硬改添加Flash(w25q32)
  15. ThinkPad物理机安装Linux系统实战企业级项目之CentOS安装
  16. python——tensorflow使用和两层全连接神经网络搭建
  17. 离散数学1.3一阶谓词逻辑
  18. 零基础 Ubuntu 20.04.01 下搭建51单片机开发环境[开源编译器SDCC]
  19. 网站怎么防止ddos攻击,防御ddos攻击的11种方法
  20. arduino接收hmi屏幕_arduino连接显示屏方法详解

热门文章

  1. 中国工业钩环市场深度研究分析报告
  2. RN8215芯片 32768Hz晶体停振案例分析
  3. Couldn‘t terminate the existing process for xxx
  4. ubuntu 下使用wireless拨号上网
  5. 【20220926】html综合案例世纪佳缘
  6. 银河麒麟服务器操作系统(国防版),银河麒麟服务器操作系统V4
  7. qt去掉莫名其妙的semantic issue
  8. python 如何识别字符串中的人名 ,如何识别一串拼音字符串以及韵母的提取 (一些方法整理)
  9. 将中文字符串转为拼音
  10. Java实现QQ邮箱登录,实现邮箱验证码三分钟失效,代码实现发送验证码和登录全过程思路。内附完整项目。