圖論的基礎知識不再闡述。
最短路徑演算法主要有二
dijkstra演算法
floyd演算法
dijkstra演算法研究的是從初始點到其他每一結點的最短路徑
而floyd演算法研究的是任意兩結點之間的最短路徑
以下圖為例,首先介紹dijstra的原理
紅字為各結點的編號,藍字為各結點之間的距離
首先定義幾個變數
結點個數n;
二維矩陣m(nxn),距離矩陣,連通的結點間即為距離,不連通的結點間為正無窮,和自己的距離為0;
一維矩陣pb(1xn),若第i點已找到最短路徑,則fp(i)=1,否則等於0,對於初始結點,fp=1;
距離矩陣d(1xn),若第i點已找到最短路徑,則的d(i)=最短距離,否則為0,初始結點d=0;
上一結點矩陣path(1xn),若第i點找到了最短路徑,則path存放這一條最短路徑的前乙個結點,通過對每一點的回溯,可以找到最短路徑。
根據距離寫出以下距離矩陣
確定初始點為v1,則pb(1)=1;
在圖中,結點上,我們將已找到最短路徑的點標為它的最短距離,(可以理解為v1點已找到最短路徑,距離為0),未找到的其餘點表為正無窮(即表示不連通)。
在與v1連通的點中,即在矩陣m的第1行,尋找最小值,最小值所在列即確定的最短路徑的結點,如同v2最短,pb(2)=1,d(2)=1,對於已找到最短路徑的v2上一結點為v1,path(2)=1;
接著,在
以上兩種中尋找最短距離,最短為v6,pb(6)=1;d(6)=2;path(6)=1;
重複以上步驟,在
附上**:
clc;clear;
n=6; %設定矩陣大小
temp=1; %設定起始點
m=zeros(6);%定義n階零矩陣
m(1,2)=1;m(1,6)=2;%設定矩陣中非零非無窮的值
m(2,1)=1;m(2,3)=4;m(2,6)=4;
m(3,2)=4;m(3,4)=2;m(3,6)=1;
m(4,3)=2;m(4,5)=3;m(4,6)=3;
m(5,4)=3,m(5,6)=5;
m(6,1)=2;m(6,2)=4;m(6,3)=1;m(6,4)=3;m(6,5)=5;
fori=1:n
forj=1:n
if(m(i,j)==0)
m(i,j)=inf;
endendend
fori=1:n
m(i,i)=0;
endpb(1:length(m))=0;pb(temp)=1;%求出最短路徑的點為1,未求出的為0
d(1:length(m))=0;%存放各點的最短距離
path(1:length(m))=0;%存放各點最短路徑的上一點標號
while sum(pb)%判斷每一點是否都已找到最短路徑
tb=find(pb==0);%找到還未找到最短路徑的點
fb=find(pb);%找出已找到最短路徑的點
min=inf;
fori=1:length(fb)
forj=1:length(tb)
plus=d(fb(i))+m(fb(i),tb(j)); %比較已確定的點與其相鄰未確定點的距離
if((d(fb(i))+m(fb(i),tb(j)))i))+m(fb(i),tb(j));
lastpoint=fb(i);
newpoint=tb(j);
endendend
d(newpoint)=min;
pb(newpoint)=1;
path(newpoint)=lastpoint; %最小值時的與之連線點
endd
path
路徑只需向上回溯就可得到。 Dijkstra最短路徑演算法
基本思路是 選擇出發點相鄰的所有節點中,權最小的乙個,將它的路徑設定為確定。其他節點的路徑需要儲存起來。然後從剛剛確認的那個節點的相鄰節點,算得那些節點的路徑長。然後從所有未確定的節點中選擇乙個路徑最短的設定為確定。重複上面步驟即可。void dijkstra graph g,string v fl...
Dijkstra最短路徑演算法
引入 dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。package dijkstra p...
最短路徑 Dijkstra演算法
最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...