最優乘車(廣度優先搜尋)

2021-07-11 01:57:59 字數 2357 閱讀 2118

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 7

6 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 遍歷標...