最短路徑中超級源點的使用
阿新 • • 發佈:2022-01-14
1. 問題:
在最短路徑問題中,如果源點有多個,我之前的做法可能都是遍歷這n個源點
2. 背景題目
leetcode題目:大致意思如下
給定一個 01 矩陣 mat,輸出一個大小相同的矩陣,其中每一個格子是 mat 中對應位置元素到最近的 0 的距離。
(斜對角的距離是2)
(簡單理解就是地圖上陸地每個位置到海洋的最短距離)
2.1之前的思考
遍歷這個二維矩陣唄,對每個1進行一次BFS,求最短路徑
但後來發現,假設有個A位置,則這個A可能不止一次的要被BFS訪問到,因為他可能出現在很多結點的BFS路徑上(比如這個A是海邊的一個結點)
2.2 問題的簡化
如果海洋只有一個點的話,問題就可以倒過來想了,海洋到所有陸地的最短距離(單個源點)
2.3 超級源點(超級0)
而當海洋麵積變大的時候(多個源點),可以考慮設定一個超級源點super0,他到所有海洋(0)的距離都是1,
這時候,這些0其實就相當於從超級源點開始BFS後的第一步
這時候,每一個陸地(1)就只用被bFS跑一次了
並且,更重要的是,避免了多次使用BFS時遍歷標記位的複雜考慮,總不能每個頂點都重置一次標記矩陣吧。。
2.4 具體實施
所有的0都相當於超級0進行BFS時的第一層,就直接double fori把所有0都壓到佇列裡就ok了,然後一切照舊
本文來自部落格園,作者:熒惑微光,轉載請註明原文連結:https://www.cnblogs.com/yinghuoweiguang/p/15799531.html