生活随笔
收集整理的這篇文章主要介紹了
每一对顶点之间的最短路径
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
// func7-2.cpp 算法7.16,algo7-7.cpp和algo7-9.cpp用到
void ShortestPath_FLOYD(MGraph G,PathMatrix P,DistancMatrix D)
{ // 用Floyd算法求有向網G中各對頂點v和w之間的最短路徑P[v][w]及其帶權長度D[v][w]。// 若P[v][w][u]為TRUE,則u是從v到w當前求得最短路徑上的頂點。算法7.16int u,v,w,i;for(v=0;v<G.vexnum;v++) // 各對結點之間初始已知路徑及距離for(w=0;w<G.vexnum;w++){D[v][w]=G.arcs[v][w].adj; // 頂點v到頂點w的直接距離for(u=0;u<G.vexnum;u++)P[v][w][u]=FALSE; // 路徑矩陣初值if(D[v][w]<INFINITY) // 從v到w有直接路徑P[v][w][v]=P[v][w][w]=TRUE; // 由v到w的路徑經過v和w兩點}for(u=0;u<G.vexnum;u++)for(v=0;v<G.vexnum;v++)for(w=0;w<G.vexnum;w++)if(D[v][u]<INFINITY&&D[u][w]<INFINITY&&D[v][u]+D[u][w]<D[v][w]){ // 從v經u到w的一條路徑更短D[v][w]=D[v][u]+D[u][w]; // 更新最短距離for(i=0;i<G.vexnum;i++)P[v][w][i]=P[v][u][i]||P[u][w][i]; // 從v到w的路徑經過從v到u和從u到w的所有路徑}
}// algo7-7.cpp 實現算法7.16的程序
#define MAX_NAME 5 // 頂點字符串的最大長度+1
#define MAX_INFO 20 // 相關信息字符串的最大長度+1
typedef int VRType;
typedef char VertexType[MAX_NAME];
typedef char InfoType;
#include"c1.h"
#include"c7-1.h" // 鄰接矩陣存儲結構
#include"bo7-1.cpp" // 鄰接矩陣存儲結構的基本操作
typedef int PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 3維數組
typedef int DistancMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 2維數組
#include"func7-2.cpp" // 求有向網中各對頂點之間最短距離的Floyd算法
void main()
{MGraph g;int i,j,k,l,m,n;PathMatrix p; // 3維數組DistancMatrix d; // 2維數組CreateDN(g); // 構造有向網gfor(i=0;i<g.vexnum;i++)g.arcs[i][i].adj=0; // ShortestPath_FLOYD()要求對角元素值為0,因為兩點相同,其距離為0Display(g); // 輸出有向網gShortestPath_FLOYD(g,p,d); // 求每對頂點間的最短路徑,在func7-2.cpp中printf("d矩陣:\n");for(i=0;i<g.vexnum;i++){for(j=0;j<g.vexnum;j++)printf("%6d",d[i][j]);printf("\n");}for(i=0;i<g.vexnum;i++)for(j=0;j<g.vexnum;j++)if(i!=j)printf("%s到%s的最短距離為%d\n",g.vexs[i],g.vexs[j],d[i][j]);printf("p矩陣:\n");for(i=0;i<g.vexnum;i++)for(j=0;j<g.vexnum;j++)if(i!=j){printf("由%s到%s經過:",g.vexs[i],g.vexs[j]);for(k=0;k<g.vexnum;k++)if(p[i][j][k]==1)printf("%s ",g.vexs[k]);printf("\n");}
}
代碼的運行結果:
請輸入有向網G的頂點數,弧數,弧是否含其它信息(是:1,否:0): 3,5,0(見圖770) 請輸入3個頂點的值(<5個字符): A B C 請輸入5條弧的弧尾弧頭權值(以空格作為間隔): A B 4 A C 11 B A 6 B C 2 C A 3 3個頂點5條邊或弧的有向網。頂點依次是: A B C G.arcs.adj: 0 4 11 6 0 2 3 32767 0 G.arcs.info: 頂點1(弧尾) 頂點2(弧頭) 該邊或弧的信息: d矩陣: 0 4 6 5 0 2 3 7 0 A到B的最短距離為4 A到C的最短距離為6 B到A的最短距離為5 B到C的最短距離為2 C到A的最短距離為3 C到B的最短距離為7 p矩陣:
由A到B經過:A B 由A到C經過:A B C 由B到A經過:A B C 由B到C經過:B C
由C到A經過:A C 由C到B經過:A B C
求有向網中各對頂點之間最短距離的Floyd 算法ShortestPath_FLOYD()要求其網的鄰 接矩陣中對角元素的權值為0。因為用鄰接矩陣表示各頂點之間的距離,顯然,同一點之 間的距離為0。 ShortestPath_FLOYD()算法的思路很簡單,首先以2 頂點之間的直接路徑為最短路 徑,如果能找到第3 點,使2 頂點通過第3 點的路徑比直接路徑要短,則以這3 點形成的 路徑為2 頂點之間的最短路徑。依次再找第4 點、第5 點、?? 如以上程序運行結果所 示,根據圖770 及鄰接矩陣,A→C 的直接距離是11,但A→B→C 的距離是6,則以6 取代11 作為A→C 的最短距離。 ShortestPath_FLOYD()不僅可用于有向網,也可用于無向網。因為無向網的1 條邊相 當于有向網的2 條弧。 教科書中圖7.33 是描述中國大陸地區鐵路交通的無向網。程序algo7-9.cpp 利用 ShortestPath_FLOYD()可求得該網中每2 個站點之間的最短距離。該無向網的數據是利用 文件map.txt 輸入的。map.txt 的內容如下(在教科書中圖7.33 的基礎上另加孤立頂點 臺北):
26 30 烏魯木齊 呼和浩特 哈爾濱 西寧 蘭州 成都 昆明 貴陽 南寧 柳州 株州 廣州 深圳 南昌 福州 上海 武漢 西安 鄭州 徐州 北京 天津 沈陽 大連 長春 臺北
烏魯木齊蘭州1892 呼和浩特蘭州1145 呼和浩特北京668 哈爾濱長春242 西寧蘭州216 蘭州西安676 西安成都842 西安鄭州511 成都昆明1100 成都貴陽967 昆明貴陽639 貴陽柳州607 柳州株州672 柳州南寧255 貴陽株州902 株州武漢409 株州廣州675 株州南昌367 廣州深圳140 南昌福州622 南昌上海825 武漢鄭州534 鄭州北京695 鄭州徐州349 徐州天津674 徐州上海651 北京天津137 天津沈陽704 沈陽大連397 沈陽長春305
轉載于:https://www.cnblogs.com/KongkOngL/p/4074447.html
總結
以上是生活随笔 為你收集整理的每一对顶点之间的最短路径 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。