當各個節點的權重一樣的時候,最小代價的路徑=最短距離路徑。可以把bfs理解為每次擴張一圈,只要記錄每個節點在第幾圈即可,與具體怎麼從乙個圈到達另乙個圈的路徑無關。
解法一:bfs+優先佇列
當每個節點權重不一樣時,要想使每個節點的代價最小,只要保證所有能到達它的節點的代價都是最小的,並從中選擇最小的那個用來確定它的代價即可。
bfs+優先佇列中,每次出隊的時候,出隊元素的代價都是全域性最小的,因為之**隊節點的代價一定大於當前佇列中所有節點的代價,而每次出隊的又都是當前佇列中代價最小的元素。節點出隊時,會更新所有與它相鄰節點的代價,全域性最小代價一定滿足上述的條件。所以每個節點的代價都是最小的。
//優先佇列
#include
using
namespace std;
const
int maxn =
205;
char mp[maxn]
[maxn]
;int n, m, spt[maxn]
[maxn]
;int dir[
2]=,
,,};
struct node
friend
bool
operator
<
(node a,node b)};
intbfs
(int x,
int y,
int x_,
int y_)}}
return-1
;}intmain()
}int ans =
bfs(sx, sy, ex, ey);if
(~ans)
printf
("%d\n"
, ans)
;else
printf
("impossible\n");
}return0;
}
openjudge 拯救行動
描述 公主被惡人抓走,被關押在牢房的某個地方。牢房用n m n,m 200 的矩陣來表示。矩陣中的每項可以代表道路 牆壁 和守衛 x 英勇的騎士 r 決定孤身一人去拯救公主 a 我們假設拯救成功的表示是 騎士到達了公主所在的位置 由於在通往公主所在位置的道路中可能遇到守衛,騎士一旦遇到守衛,必須殺死...
openjudge 拯救行動
總時間限制 10000ms 記憶體限制 65536kb 描述 公主被惡人抓走,被關押在牢房的某個地方。牢房用n m n,m 200 的矩陣來表示。矩陣中的每項可以代表道路 牆壁 和守衛 x 英勇的騎士 r 決定孤身一人去拯救公主 a 我們假設拯救成功的表示是 騎士到達了公主所在的位置 由於在通往公主...
百練 4116 拯救行動
總時間限制 1000ms 記憶體限制 65536kb 描述公主被惡人抓走,被關押在牢房的某個地方。牢房用n m n,m 200 的矩陣來表示。矩陣中的每項可以代表道路 牆壁 和守衛 x 英勇的騎士 r 決定孤身一人去拯救公主 a 我們假設拯救成功的表示是 騎士到達了公主所在的位置 由於在通往公主所在...