圖與網絡(未完成)

兩個指定頂點之間的最短路徑

迪克斯特拉(Dijkstra)算法:思想是按距u從近到遠的順序,依次的求得u到G的各頂點的最短路和距離,直至v。(或直至G的所有頂點),。爲避免重複並保留每一步的計算信息,採用了標號算法。

eg:對於六個城市,之間的距離權重價格用矩陣的形式記錄下來了,求第一個城市到其他城市間的票價最便宜的路線圖

%行向量pb,index1,index2,d分別存放P標號信息,標號定點順序,標號頂點索引,最短通路的值。
pb=1表示已經標註,完成對這個頂點的最短路徑尋找
d(i)存放始點到第i點最短通路的值。
index2(i)存放到第i點最短通路中第i定點前一頂點的序號;


a = zeros(6);
a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;
a(2,3)=15;a(2,4)=20;a(2,6)=25;
a(3,4)=10;a(3,5)=20;
a(4,5)=10;a(4,6)=25;
a(5,6)=55;
a=a+a';
a(find(a==0))=inf;  %矩陣創建
pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a));
d(1:length(a))=inf;d(1)=0;temp=1;  %數據初始化
while sum(pb)<length(a)  %直到頂點都標註了,結束
    tb=find(pb==0);      
    d(tb)=min(d(tb),d(temp)+a(temp,tb)); %得到矩陣是temp=1到頂點的最短距離
    tmpb=find(d(tb)==min(d(tb)));  %對於上一步而言沒有變化的
    temp =tb (tmpb(1));   %temp是沒有變化的第一個點
    pb(temp)=1;   %temp這個點完成標記
    index1=[index1,temp];  %記下了這次循環到那個點的距離最短
    temp2=find(d(index1)==d(temp)-a(temp,index1));
    index2(temp)=index1(temp2(1));
end
d,index1,index2

當求每對頂點之間的最短路徑時,我們當然可以還用上述的Dijkstra算法,在套一個循環,以不同的定點爲起點,但此時的時間按複雜度爲O(n^3),第二種方法是Floyd算法其思想是:遞推產生一個矩陣A0,A1,A2,,,,,Ak,,,,,An,其中Ak(i,j)表示從頂點Vi到頂點Vj的路徑上所經過的頂點序號不大於k的最短路徑長度。

計算時的遞推公式

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章