乘車路線查詢

2021-05-22 22:56:19 字數 2884 閱讀 5830

-- 模擬資料

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公園遊玩,但如果從他所在的...