迪傑斯特拉演算法

2021-05-23 00:50:14 字數 3589 閱讀 6443

if object_id('t_test') is not null drop table t_test

gocreate table [dbo].[t_test](

[id] [int] identity(1,1) not null primary key,    --自增字段,無意義

[header] [varchar](500),    --第一點的名稱

[next] [varchar](500),    --第二點的名稱

[distance] [int] null    --兩點之間的距離

)insert into t_test (header,next,distance) values ('a','b',20)

insert into t_test (header,next,distance) values ('a','c',10)

insert into t_test (header,next,distance) values ('b','d',30)

insert into t_test (header,next,distance) values ('d','e',40)

insert into t_test (header,next,distance) values ('c','e',50)

insert into t_test (header,next,distance) values ('d','f',30)

insert into t_test (header,next,distance) values ('e','g',70)

insert into t_test (header,next,distance) values ('f','h',100)

insert into t_test (header,next,distance) values ('g','h',340)

insert into t_test (header,next,distance) values ('h','i',420)

insert into t_test (header,next,distance) values ('i','j',15)

insert into t_test (header,next,distance) values ('j','k',70)

insert into t_test (header,next,distance) values ('k','l',60)

insert into t_test (header,next,distance) values ('l','m',100)

insert into t_test (header,next,distance) values ('j','n',45)

insert into t_test (header,next,distance) values ('n','o',85)

insert into t_test (header,next,distance) values ('m','o',65)

insert into t_test (header,next,distance) values ('o','p',90)

insert into t_test (header,next,distance) values ('p','q',10)

insert into t_test (header,next,distance) values ('q','r',20)

insert into t_test (header,next,distance) values ('p','s',50)

insert into t_test (header,next,distance) values ('q','t',70)

insert into t_test (header,next,distance) values ('t','u',90)

insert into t_test (header,next,distance) values ('u','v',100)

insert into t_test (header,next,distance) values ('v','w',20)

insert into t_test (header,next,distance) values ('w','x',20)

insert into t_test (header,next,distance) values ('t','x',50)

insert into t_test (header,next,distance) values ('x','y',70)

insert into t_test (header,next,distance) values ('y','z',90)

select * from t_test

declare @source varchar(500),@traget varchar(500),@city varchar(500)

--假設求a到z的最短距離

select @source='a',@traget='z'

--建立最短距離表

declare @mindistance table(

traget [varchar](500)

,distance int

)--建立備選距離表

declare @nowdistance table(

traget [varchar](500)

,distance int

)--向備選距離表中插入初始記錄

select @source,0

union all

select t1.header, t2.distance   from (

select header from t_test

union

select next from t_test

) t1

left join t_test t2 on (t2.header=@source or t2.next=@source )

and (t2.header=t1.header or t2.next=t1.header )

where t1.header<>@source

--從備選距離表中迴圈取最小距離插入最短距離表,同時更新備選距離表,直到目標位址出現在最短記錄表中

while not exists(select 1 from @mindistance where traget=@traget )

begin

select top 1 @city=traget  from @nowdistance t1 where not exists(

select 1 from @nowdistance t2 where t2.tragetinsert into @mindistance

select top 1 * from @nowdistance t1 where not exists(

select 1 from @nowdistance t2 where t2.tragetupdate @nowdistance set distance=1

from @nowdistance t1

inner join t_test t2 on (t1.traget=t2.header or t1.traget=t2.next ) and

end

迪傑斯特拉演算法

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...

迪傑斯特拉演算法

迪傑斯特拉演算法用來計算圖中某一點到其他點的最短距離,這個圖可以是加權,也可以是無權的,距離指的是從一點到其它點所經過的邊的權重和 假設現在有乙個加權無向圖,我們要求節點1到其他點的最短距離 初始化圖arr 用乙個鄰接矩陣來表示一張圖,矩陣元素 初始化一維向量d,這個向量儲存的是其他點的最短距離,初...

迪傑斯特拉演算法

dijkstra演算法 單源最短路徑 每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終得到源點到其餘所有點的最短路徑。1.把所有的頂點分為兩部分 已知最短路程的頂點集合p和未知最短路徑的頂點集合q。最開始,p集合中只有源點乙個頂點,用visit i 陣列來記錄哪些點在集合p。vis...