多源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;
}
【題目描述】
小藍在一張無限大的特殊畫布上作畫。思路:每分鐘擴散1點,說明了邊權都為1,而且有多個起點,因此可以使用多源bfs,維護乙個這張畫布可以看成乙個方格圖,每個格仔可以用乙個二維的整數座標表示。
小藍在畫布上首先點了一下幾個點:(0,0),(2020,11),(11,14),(2000,2000)。只有這幾個格仔上有黑色,其它位置都是白色的。
每過一分鐘,黑色就會擴散一點。具體的,如果乙個格仔裡面是黑色,它就會擴散到上、下、左、右四個相鄰的格仔中,使得這四個格仔也變成黑色(如果原來就是黑色,則還是黑色)。
請問,經過 2020 分鐘後,畫布上有多少個格仔是黑色的。
本題無輸入,請直接輸出乙個答案即可。
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個...