description
h城是乙個旅遊勝地,每年都有成千上萬的人前來觀光。為方便遊客,巴士公司在各個旅遊景點及賓館,飯店等地都設定了巴士站並開通了一些單程巴上線路。每條單程巴士線路從某個巴士站出發,依次途經若干個巴士站,最終到達終點巴士站。
一名旅客最近到h城旅遊,他很想去s公園遊玩,但如果從他所在的飯店沒有一路已士可以直接到達s公園,則他可能要先乘某一路巴士坐幾站,再下來換乘同一站台的另一路巴士, 這樣換乘幾次後到達s公園。
現在用整數1,2,…n 給h城的所有的巴士站編號,約定這名旅客所在飯店的巴士站編號為1…s公園巴士站的編號為n。
寫乙個程式,幫助這名旅客尋找乙個最優乘車方案,使他在從飯店乘車到s公園的過程中換車的次數最少。
input
輸入的第一行有兩個數字m和n(1<=m<=100 1
output
輸出檔案只有一行。如果無法乘巴士從飯店到達s公園,則輸出"n0",否則輸出你的程式所找到的最少換車次數,換車次數為0表示不需換車即可到達•
sample input
3 76 74 7 3 6
2 1 3 5
sample output
2
解題思路:先讀入資料,並且用布林型二維陣列儲存每個站之間的關係,然後用佇列的思想,尋找符合題意的最佳路線,最後按要求輸出即可。
程式:
const
maxn=500;
var
a:array[1..maxn,1..maxn]of boolean;
v:array[1..maxn] of boolean;
road,state,father:array[1..maxn] of integer;
m,n:integer;
procedure init;
var
i,j,k:integer;
begin
for i:=1 to maxn do
state[i]:=-1;
readln(m);
readln(n);
for i:=1 to m do
begin
k:=0;
repeat
inc(k);
read(road[k]);
for j:=1 to k-1 do
a[road[j],road[k]]:=true;
until eoln;
end;
end;
procedure main;
var
head,tail,i,j,k:integer;
begin
head:=0;tail:=1;father[1]:=1;state[1]:=-1;v[1]:=true;
repeat
inc(head);
for i:=1 to n do
if a[father[head],i] and not v[i]
then begin
inc(tail);
v[i]:=true;
father[tail]:=i;
state[i]:=state[father[head]]+1;
end;
until (head=tail) or v[n];
if head=tail then writeln('no')
else writeln(state[i]);
end;
begin
init;
main;
end.
廣度優先搜尋尋找最優路徑 以及雙向廣度搜尋演算法
這裡是poj1915上的一道在棋盤上搜尋走步路徑的題目 如下 使用bfs 通過這道題目我有如下的幾點總結 1 一開始我通過struct結構來表示每一步到達的座標位置,其中設定了乙個struct parent的指標,而不是改進後的int parent 但是在實際的除錯過程中,出現了非常奇怪的現象,被壓...
搜尋 廣度優先搜尋
廣度優先搜尋一層一層地進行遍歷,每層遍歷都是以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。class solution,int shortestpathbinarymatrix vectorint grid length return 1 cl...
廣度優先搜尋
include include include include using namespace std struct node 圖頂點結構定義 typedef struct node graph 圖形的結構新型態 struct node head 9 圖形頂點陣列 int visited 9 遍歷標...