公交車路線查詢系統後台資料庫設計系列文章
(該資料庫已經輸入了廣州市350條公交車路線作為測試資料)
在《查詢演算法
》和《關聯地名和站點
》兩篇文章中,已經實現了通過地名或站點進行路線查詢的演算法,但是在現實中,從起點到終點不一定全程都是乘車,例如,有以下3條路線:
r1: s1->s2->s3->s4->s5
r2: s6->s7->s2->s8
r3: s8->s9->s10
假如現在要從站點s1到s7,如果用inquiry查詢路線,顯然沒有合適的乘車方案。但是s2和s7相距僅僅乙個站的距離,可以用步行代替,因此可以先從
s1乘坐r1到
s2再步行到s7。
為了實現在乘車路線中插入步行路線,在資料庫使用walkroute(startstop, endstop, distance, remark)(startstop-起始站點,endstop-目的站點,distance-距離,remark-備註)儲存距離較近的兩個站點。
加入表walkroute
後,查詢演算法也要作相應的修改,其實
walkroute
和routet0
很相似,因此只需把
walkroute
看成是特殊的直達線路即可,修改後的
inqueryt1
如下:
/*查詢站點@startstops到站點@endstops之間的一次換乘乘車路線,多個站點用'/'分開,如:
exec inquiryt1 '站點1/站點2','站點3/站點4'
*/ create proc inquiryt1(@startstops varchar(32),@endstops varchar(32))
as begin
declare @ss_tab table(name varchar(32))
declare @es_tab table(name varchar(32))
insert @ss_tab select value from dbo.splitstring(@startstops,'/')
insert @es_tab select value from dbo.splitstring(@endstops,'/')
if(exists(select * from @ss_tab sst,@es_tab est where sst.name=est.name))
begin
raiserror ('起點集和終點集中含有相同的站點',16,1)
return
end
declare @stops table(name varchar(32))
insert @stops select name from @ss_tab
insert @stops select name from @es_tab
declare @result table(
startstop varchar(32),
route1 varchar(256),
transstop varchar(32),
route2 varchar(256),
endstop varchar(32),
stopcount int
) declare @count int
set @count=0
--查詢"步行-乘車"路線
insert @result
select
sst.name as startstop,
'從'+r1.startstop+'步行到'+r1.endstop as route1,
r1.endstop as transstop,
r2.route as route2,
est.name as endstop,
r2.stopcount as stopcount
from
@ss_tab sst,
@es_tab est,
(select * from walkroute where endstop not in (select name from @stops)) r1,
routet0 r2
where
sst.name=r1.startstop
and r1.endstop=r2.startstop
and r2.endstop=est.name
order by r2.stopcount
set @count=@@rowcount
--查詢"乘車-步行"路線
insert @result
select
sst.name as startstop,
r1.route as route1,
r1.endstop as transstop,
'從'+r2.startstop+'步行到'+r2.endstop as route2,
est.name as endstop,
r1.stopcount as stopcount
from
@ss_tab sst,
@es_tab est,
routet0 r1,
(select * from walkroute where startstop not in (select name from @stops)) r2
where
sst.name=r1.startstop
and r1.endstop=r2.startstop
and r2.endstop=est.name
order by r1.stopcount
set @count=@count+@@rowcount
if(@count=0)
begin
--查詢"乘車-乘車"路線
insert @result
select
sst.name as startstop,
r1.route as route1,
r1.endstop as transstop,
r2.route as route2,
est.name as endstop,
r1.stopcount+r2.stopcount as stopcount
from
@ss_tab sst,
@es_tab est,
(select * from routet0 where endstop not in (select name from @stops)) r1,
routet0 r2
where
sst.name=r1.startstop
and r1.endstop=r2.startstop
and r2.endstop=est.name
and r1.route<>r2.route
order by r1.stopcount+r2.stopcount
end
select
startstop as 起始站點,
route1 as 路線1,
transstop as 中轉站點,
route2 as 路線2,
endstop as 目的站點,
stopcount as 總站點數
from
@result
end
e-mail:[email protected]
出處:
公交車路線查詢系統後台資料庫設計 查詢演算法
1.公交車路線資訊在資料庫中的儲存方式 顯然,如果在資料庫中簡單的使用表bus route 路線名 路線經過的站點,費用 來儲存公交車路線的線路資訊,則很難使用查詢語句實現乘車線路查詢,因此,應該對線路的資訊進行處理後再儲存到資料庫中,筆者使用的方法是用站點 路線關係表stop route 站點 路...
洛谷 2233 HNOI2002 公交車路線
題目戳這裡 一句話題意 乙個大小為8的環,求從1到5正好n步的方案數 途中不能經過5 solution 鉅說這個題目很水 應該是比較容易的dp,直接從把左邊和右邊的方案數加起來即可,但是有幾個需要注意的地方 1.因為n有1e7所以需要滾動陣列。2.因為不能經過5,所以4只能從3轉移,6只能從7轉移。...
HNOI2002 公交車路線(矩陣快速冪)題解
題目描述 在長沙城新建的環城公路上一共有8個公交站,分別為a b c d e f g h。公共汽車只能夠在相鄰的兩個公交站之間執行,因此你從某乙個公交站到另外乙個公交站往往要換幾次車,例如從公交站a到公交站d,你就至少需要換3次車。tiger的方向感極其糟糕,我們知道從公交站a到公交e只需要換4次車...