每對頂點間最短路徑—-Floyd演算法

來源:互聯網
上載者:User

 對於一個各邊權值均大於零的有向圖,對每一對頂點,求出vi與vj之間的最短路徑和最短路徑長度。

以下程式碼封裝含有向圖的建立,Floyd演算法的實現以及輸出最短路徑和最短路徑長度,具體過程請看【動畫示範Floyd演算法】。

代碼說明幾點:

1、A[][]數組初始化為各頂點間的原本距離,最後儲存各頂點間的最短距離。

2、path[][]數組儲存最短路徑,與當前迭代的次數有關。初始化都為-1,表示沒有中間頂點。在求A[i][j]過程中,path[i][j]存放從頂點vi到頂點vj的中間頂點編號不大於k的最短路徑上前一個結點的編號。在演算法結束時,由二維數組path的值回溯,可以得到從頂點vi到頂點vj的最短路徑。

初始化A[][]數組為如下,即有向圖的鄰接矩陣。

完整的實現代碼如下:

#include <iostream><br />#include <string><br />#include <stdio.h><br />using namespace std;<br />#define MaxVertexNum 100<br />#define INF 32767<br />typedef struct<br />{<br /> char vertex[MaxVertexNum];<br /> int edges[MaxVertexNum][MaxVertexNum];<br /> int n,e;<br />}MGraph; </p><p>void CreateMGraph(MGraph &G)<br />{<br /> int i,j,k,p;<br /> cout<<"請輸入頂點數和邊數:";<br /> cin>>G.n>>G.e;<br /> cout<<"請輸入頂點元素:";<br /> for (i=0;i<G.n;i++)<br /> {<br /> cin>>G.vertex[i];<br /> }<br /> for (i=0;i<G.n;i++)<br /> {<br /> for (j=0;j<G.n;j++)<br /> {<br /> G.edges[i][j]=INF;<br /> if (i==j)<br /> {<br /> G.edges[i][j]=0;<br /> }<br /> }<br /> }<br /> for (k=0;k<G.e;k++)<br /> {<br /> cout<<"請輸入第"<<k+1<<"條弧頭弧尾序號和相應的權值:";<br /> cin>>i>>j>>p;<br /> G.edges[i][j]=p;<br /> }<br />}<br />void Dispath(int A[][MaxVertexNum],int path[][MaxVertexNum],int n);</p><p>void Floyd(MGraph G)<br />{<br />int A[MaxVertexNum][MaxVertexNum],path[MaxVertexNum][MaxVertexNum];<br />int i,j,k;<br />for (i=0;i<G.n;i++)<br />{<br />for (j=0;j<G.n;j++)<br />{<br />A[i][j]=G.edges[i][j];<br />path[i][j]=-1;<br />}<br />}<br />for (k=0;k<G.n;k++)<br />{<br />for (i=0;i<G.n;i++)<br />{<br />for (j=0;j<G.n;j++)<br />{<br />if (A[i][j]>A[i][k]+A[k][j])<br />{<br />A[i][j]=A[i][k]+A[k][j];<br />path[i][j]=k;<br />}<br />}<br />}<br />}<br />Dispath(A,path,G.n);<br />}</p><p>void Ppath(int path[][MaxVertexNum],int i,int j)<br />{<br />int k;<br />k=path[i][j];<br />if (k==-1)<br />{<br />return;<br />}<br />Ppath(path,i,k);<br />printf("%d",k);<br />Ppath(path,k,j);<br />}</p><p>void Dispath(int A[][MaxVertexNum],int path[][MaxVertexNum],int n)<br />{<br />int i,j;<br />for (i=0;i<n;i++)<br />{<br />for (j=0;j<n;j++)<br />{<br />if (A[i][j]==INF)<br />{<br />if (i!=j)<br />{<br />printf("從%d到%d沒有路徑/n",i,j);<br />}<br />}<br />else<br />{<br />printf(" 從%d到%d=>路徑長度:%d路徑:",i,j,A[i][j]);<br />printf("%d,",i);<br />Ppath(path,i,j);<br />printf("%d/n",j);<br />}<br />}<br />}<br />}</p><p>int main()<br />{<br />MGraph G;<br />CreateMGraph(G);<br />Floyd(G);<br />return 0;<br />}

測試結果如下:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.