多源最短路徑問題(bfs)

2021-10-03 21:45:50 字數 1696 閱讀 1776

公司的程式設計師不夠用了,決定把產品經理都轉變為程式設計師以解決開發時間長的問題。

在給定的矩形網格中,每個單元格可以有以下三個值之一:

每分鐘,任何與程式設計師(在4個正方向上)相鄰的產品經理都會變成程式設計師。

返回直到單元格中沒有產品經理為止所必須經過的最小分鐘數。

如果不可能,返回-1。

以下是乙個4分鐘轉變完成的示例:

2 1 1      2 2 1      2 2 2      2 2 2      2 2 2

1 1 0 -> 2 1 0 -> 2 2 0 -> 2 2 0 -> 2 2 0

0 1 1 0 1 1 0 1 1 0 2 1 0 2 2

輸入格式

不固定多行(行數不超過10),毎行是按照空格分割的數字(不固定,毎行數字個數不超過10)。

其中每個陣列項的取值僅為0、1、2三種。

讀取時可以按行讀取,直到讀取到空行為止,再對讀取的所有行做轉換處理。

輸出格式

如果能夠將所有產品經理變成程式設計師,則輸出最小的分鐘數。

如果不能夠將所有的產品經理變成程式設計師,則返回-1.

輸入樣例:

0 2

1 0

輸出樣例:

-1
輸入樣例:

1 2 1

1 1 0

0 1 1

輸出樣例:

3
1、因為是寬搜,將每次增加的節點存放在queue中

2、首先將值為2的節點加入,然後遍歷值為2 的節點,加入佇列,並設定dis為0

3、然後遍歷值為2的節點相鄰的節點且值為1的節點,將節點加入佇列,然後將dis更新為上次的dis+1

4、最後判斷dis[m][n]這個二維陣列中是否有存在-1且給定矩陣中值為1出現,若有,返回-1

5、否則,返回dis矩陣中的最大值

#include

#include

#include

#include

#include

using

namespace std;

//定義queue插入的pair

typedef pair<

int,

int> pii;

const

int n =15;

int n =

0,m =0;

int dis[n]

[n];

int g[n]

[n];

intbfs()

);}}

//在佇列進行寬搜

int dx[4]

=,dy[4]

=;while

(que.

size()

));}

}}int res =0;

for(

int i =

0; i < n; i++

)for

(int j =

0; j < m; j++)}

return res;

}int

main()

cout<<

bfs(

)

0;

多源最短路徑問題

problem description tonyy是乙個喜歡到處浪的男人,他的夢想是帶著蘭蘭姐姐浪遍 的各個角落,不過在此之前,他需要做好規劃。現在他的手上有乙份 地圖,上面有n個城市,m條交通路徑,每條交通路徑都是單行道。他已經預先規劃好了一些點作為旅遊的起點和終點,他想選擇其中乙個起點和乙個終點...

多源最短路徑

可以簡單的通過執行 v 次單源最短路徑演算法來解決,每次使用乙個不同的結點作為源結點 多數演算法採用鄰接矩陣來表示圖,因此 演算法的輸入為乙個n n的矩陣w,代表乙個有n個結點的有向圖g v,e 的邊的權重 wij 0 若i j 權重 若i j,且 i,j 屬於e inf 若i j,且 i,j 不屬...

多源最短路徑問題 floyd warshall

儲存圖如下 的演算法思想 該段 的基本思想是 最開始只允許1號頂點進行中轉,接下來只允許經過1號和2號頂點進行中轉.允許經過1 n號所有頂點進行中轉,求任意兩個點之間的最短距離用一句話概括,就是從i號頂點到j號頂點只經過前k號點的最短路徑 floyd warshall核心演算法 5行 for k 1...