演算法競賽 多源BFS

2022-09-19 09:21:07 字數 3111 閱讀 7812

多源bfs與單源bfs有什麼區別呢?

如何解決多源bfs?

多源bfs:多個起點 ——> 多個起點同時加入佇列!

核心:在求解多源bfs問題時,同時將所有起點加入佇列即可!

【題目鏈結】173. 矩陣距離 - acwing題庫

給定乙個 nn 行 mm 列的 0101 矩陣 aa,a[i] [j] 與a[k] [l] 之間的曼哈頓距離定義為:

dist(a[i] [j],a[k] [l])=|i−k|+|j−l|

輸出乙個 n 行 m 列的整數矩陣 b,其中:

b[i][j]=min1≤x≤n,1≤y≤m,a[x][y]=1dist(a[i][j],a[x][y])

輸入格式

第一行兩個整數 n,m。

接下來乙個 n 行 m 列的 01 矩陣,數字之間沒有空格。

輸出格式

乙個 n 行 m 列的矩陣 b,相鄰兩個整數之間用乙個空格隔開。

資料範圍

1≤n,m≤1000

輸入樣例:

3 4

0001

0011

0110

輸出樣例:

3 2 1 0

2 1 0 0

1 0 0 1

思路:將所有的1的點(起點)加入佇列

按照普通寬搜的方式,將其他未被搜過的點擴充套件出來,通過d[n] [n]陣列標誌且維護距離。這樣就得到了每個點到所有1的最短距離!

【**實現】

#include #include #include #include using namespace std;

typedef pairpii;

queueq;

const int n = 1010;

char g[n][n];

int d[n][n];//存放非1的點到所有1的點的最短距離

int dx[4] = , dy[4] = ;

int n, m;

void bfs()

); d[i][j] = 0;//起點到自己的距離為0}}

while(q.size())

);//鄰接節點入隊

d[a][b] = d[t.first][t.second] + 1;//更新距離}}

}int main()

return 0;

}

【題目描述】

小藍在一張無限大的特殊畫布上作畫。

這張畫布可以看成乙個方格圖,每個格仔可以用乙個二維的整數座標表示。

小藍在畫布上首先點了一下幾個點:(0,0),(2020,11),(11,14),(2000,2000)。只有這幾個格仔上有黑色,其它位置都是白色的。

每過一分鐘,黑色就會擴散一點。具體的,如果乙個格仔裡面是黑色,它就會擴散到上、下、左、右四個相鄰的格仔中,使得這四個格仔也變成黑色(如果原來就是黑色,則還是黑色)。

請問,經過 2020 分鐘後,畫布上有多少個格仔是黑色的。

本題無輸入,請直接輸出乙個答案即可。

思路:每分鐘擴散1點,說明了邊權都為1,而且有多個起點,因此可以使用多源bfs,維護乙個d[i][j]陣列來記錄當前的點是第幾分鐘的。

多源bfs:將所有黑墨水加入佇列,然後寬搜染色或者統計可以被染色的白點的個數。若採用染黑的方法最後再遍歷地圖統計即可;若統計的是可以被染成黑色的白點個數,最後答案要加4(原來的4個黑點)。

注:

【**實現】

#include #include #include #include using namespace std;

typedef pairpii;

queueq;

const int maxn = 10000;

char g[maxn][maxn];

int d[maxn][maxn];//記錄距離

int dx[4] = , dy[4] = ;

int cnt;

void bfs()

); q.push();

q.push();

q.push();

//初始化距離

d[3000][3000] = d[5020][3011] = d[3011][3014] = d[5000][5000] = 0;

while(q.size())

);d[a][b] = d[t.first][t.second] + 1;

cnt ++;}}

}int main()

//四個起點標記為黑墨水

g[3000][3000] = g[5020][3011] = g[3011][3014] = g[5000][5000] = '#';

bfs();//統計可以被4個起點染黑的白點個數

cout << cnt + 4;//總的黑點個數:被染黑 加上 原來的4個黑點

return 0;

}

答案:20312088

多源bfs的核心就是:將多個起點都加入佇列,然後再寬搜!

學習內容參考:

藍橋杯2020國賽真題

acwing演算法提高課

矩陣距離 多源BFS

給定乙個n行m列的01矩陣a,a i j 與 a k l 之間的曼哈頓距離定義為 dist a i j a k l i k j l dist a i j a k l i k j l 輸出乙個n行m列的整數矩陣b,其中 b i j min1 x n,1 y m,a x y 1dist a i j a ...

矩陣距離(多源BFS)

題目描述 給定乙個n行m列的01矩陣a,a i j 與 a k l 之間的曼哈頓距離定義為 dist a i j a k l i k j l 輸出乙個n行m列的整數矩陣b,其中 b i j min1 x n,1 y m,a x y 1dist a i j a x y 輸入格式 第一行兩個整數n,m。...

1101 著火的房間 多源bfs

救救pipi!pipi被關在乙個著火的房間裡了!該房間中有 nxm 個位置,用乙個字元矩陣表示。s 代表pipi的起點位置。t 代表出口位置。f 代表房間的著火點。代表房間還未著火的點。房間裡面有若干個著火點,每個著火點的移動速率是k 意思是若乙個位置在 x 時刻 了,那麼在 x k 時刻它周圍8個...