-- 模擬資料
set nocount on
if object_id(n'tempdb..#tb') is not null
drop table #tb
create table #tb(
id int identity
primary key,
lineid int,
state nvarchar(10),
orderid int
)insert #tb(
lineid, state, orderid)
select 1, n'廣州東', 1 union all
select 1, n'體育中心', 2 union all
select 1, n'體育西', 3 union all
select 1, n'烈士陵園', 4 union all
select 1, n'公園前', 5 union all
select 1, n'西門口', 6 union all
select 2, n'火車站', 1 union all
select 2, n'紀念堂', 2 union all
select 2, n'公園前', 3 union all
select 2, n'中大', 4 union all
select 2, n'客村', 5 union all
select 2, n'琶洲', 6 union all
select 2, n'萬勝圍', 7 union all
select 3, n'廣州東', 1 union all
select 3, n'體育西', 2 union all
select 3, n'珠江新城', 3 union all
select 3, n'客村', 4 union all
select 3, n'市橋', 5 union all
select 4, n'萬勝圍', 1 union all
select 4, n'金洲', 2
create index ix_lineid
on #tb(
lineid)
create index ix_state
on #tb(
state)
create index ix_orderid
on #tb(
orderid)
go--處理方法:
--之前也有發表過一些如何處理這個問題的方法,但效率不是太好。下面的這種方法加上了乘車方向的考慮:
--同一條線路上,只有兩個乘車方向,而且一旦方向了,就不會再反向乘車(因為是從這個方向來,再坐回去
--是不合理的);如果某個站點可以換到另一條線路,則換乘後的另一條線路也是兩個方向乘車。通過乘車方
--向的控制,減少了演算法要搜尋的路徑。
-- 乘車路線查詢
declare
@state_start nvarchar(10),
@state_stop nvarchar(10)
select
@state_start = n'廣州東',
@state_stop = n'中大'
-- 查詢
if object_id(n'tempdb..#re') is not null
drop table #re
create table #re(
id int identity
primary key,
path nvarchar(4000),
state_count int,
line_count int,
start_lineid int,
start_state nvarchar(10),
current_lineid int,
current_state nvarchar(10),
next_orderid int,
flag int,
lineids nvarchar(4000),
level int
)create index ix_current_lineid
on #re(
current_lineid )
create index ix_current_state
on #re(
current_state )
create index ix_next_orderid
on #re(
next_orderid )
create index ix_current_level
on #re(
level )
declare
@level int,
@rows int
set@level = 0
-- 開始
insert #re(
path,
state_count, line_count,
start_lineid, start_state,
current_lineid, current_state,
next_orderid, flag, lineids, level)
select
path = convert(nvarchar(4000),
rtrim(a.lineid) + n'->'
+ rtrim(b.lineid) + n'',
line_count,
state_count
from #re
where flag = 0
path line_count state_count
3->2 1 5
3->1->2 2 6
1->2 1 6
1->3->2 2 7
乘車路線 二維spfa
編號為1 n的n座城鎮用若干僅供單向行駛的道路相連,每條道路上均有兩個引數 道路長度 length 和在該條道路上行駛的費用 cost bob準備從城鎮1出發到達城鎮n,但他目前只有w的錢,為此,你需要幫助他尋找一條從城鎮1到城鎮n在他能支付的前提下的一條最短路線。wnm n為城鎮數目,2 n 10...
乘車線路查詢
背景 有如下表示乘車線路和站點的資料,要求查詢出指定站點之間的所有乘車線路 usetempdb go 模擬資料 setnocounton ifobject id n tempdb.tb is notnull drop table tb create table tb id int identity ...
最優乘車 bfs
description h城是乙個旅遊勝地,每年都有成千上萬的人前來觀光。為方便遊客,巴士公司在各個旅遊景點及賓館,飯店等地都設定了巴士站並開通了一些單程巴上線路。每條單程巴士線路從某個巴士站出發,依次途經若干個巴士站,最終到達終點巴士站。一名旅客最近到h城旅遊,他很想去s公園遊玩,但如果從他所在的...