最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)圖的最短路徑Floyd算法

 更新時間:2018年01月03日 14:35:12   作者:KittyGirllll  
這篇文章主要為大家詳細介紹了C語言實現(xiàn)圖的最短路徑Floyd算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Floyd算法直接使用二維數(shù)組求出所有頂點到所有頂點的最短路徑。

D代表頂點到頂點的最短路徑權(quán)值和的矩陣。
P代表對應(yīng)頂點的最小路徑的前驅(qū)矩陣。

以下程序在DEV C++中調(diào)試運行通過。

#include <stdio.h> 
            
#define INFINITY 65535 
 
typedef int VertexType; //頂點是字符型 
typedef int EdgeType; //邊是整型 
typedef struct //圖的鄰接矩陣存儲結(jié)構(gòu) 
{ 
 
 VertexType vexs[9]; //頂點向量 
 
 EdgeType edges[9][9];  //鄰接矩陣 
 
 int vexnum,arcnum; //圖中當前的頂點數(shù)和邊數(shù) 
 
}MGraph; 
 
/* 鄰接矩陣的建立*/ 
 
void CreateGraph(MGraph *G) 
{  
 int i,j,k,weight; 
 int ch1,ch2; 
 
 printf("請輸入頂點數(shù)和邊數(shù)(輸入格式為:頂點數(shù),邊數(shù)):"); 
 
 scanf("%d,%d",&(G->vexnum),&(G->arcnum)); 
 
 printf("請輸入頂點名稱(輸入格式為:a,b,c...):"); 
 
 for(i=0;i<G->vexnum;i++) 
 { 
  getchar(); 
  scanf("%d",&(G->vexs[i])); 
 } 
   
 for(i=0;i<G->vexnum;i++) 
  for(j=0;j<G->vexnum;j++) 
   if(i==j) 
    G->edges[i][j]=0; 
   else 
    G->edges[i][j]=INFINITY; 
 
  printf("請輸入每條邊對應(yīng)的兩個頂點名稱(輸入格式為:a,b):\n"); 
 
  for(k=0;k<G->arcnum;k++) 
  { 
   // getchar(); 
   printf("請輸入第%d條邊的兩個頂點名稱:",k+1); 
   scanf("%d,%d",&ch1,&ch2); 
   for(i=0;ch1!=G->vexs[i];i++); 
   for(j=0;ch2!=G->vexs[j];j++); 
   getchar(); 
   printf("請輸入第%d條邊的權(quán)值:",k+1); 
   scanf("%d",&weight);  
   G->edges[i][j]=weight; 
   G->edges[j][i]=weight; 
  } 
  
} 
 
void ShortestPath_Floyd(MGraph G,int P[9][9],int D[9][9]) 
{ 
 int v,w,k; 
 for(v=0;v<G.vexnum;v++)//初始化D和P 
 { 
  for(w=0;w<G.vexnum;w++) 
  { 
   D[v][w]=G.edges[v][w]; 
   P[v][w]=w; 
  } 
 } 
  
 for(k=0;k<G.vexnum;k++) 
 { 
  for(v=0;v<G.vexnum;v++) 
  { 
   for(w=0;w<G.vexnum;w++) 
   { 
    if(D[v][w]>(D[v][k]+D[k][w])) 
    {//如果經(jīng)過下標為k頂點路徑比原兩點間路徑更短,將當前兩點間權(quán)值設(shè)為更小的一個 
    D[v][w]=D[v][k]+D[k][w]; 
    P[v][w]=P[v][k]; 
    } 
     
   } 
  } 
 } 
} 
void main() 
{ 
 MGraph G; 
 CreateGraph(&G); 
 int i,j; 
 printf("edgesnum:%d\n",G.arcnum); 
 printf("vexesnum:%d\n",G.vexnum); 
 for(i=0;i<9;i++) 
 { 
  for(j=0;j<9;j++) 
   printf("%d ",G.edges[i][j]); 
  printf("\n"); 
 } 
 int v,w,k; 
 int P[9][9]; 
 int D[9][9]; 
 printf("%d\n",P); 
 printf("%d\n",D); 
 ShortestPath_Floyd(G,P,D); 
 for(v=0;v<G.vexnum;v++)//顯示路徑 
 { 
  for(w=v+1;w<G.vexnum;w++) 
  { 
   printf("v%d-v%d weight:%d ",v,w,D[v][w]); 
   k=P[v][w]; 
   printf("path:%d",v); 
   while(k!=w) 
   { 
    printf("->%d",k); 
    k=P[k][w]; 
   } 
   printf("->%d\n",w); 
  } 
 } 
} 

運行結(jié)果如圖所示。


整個算法的時間復(fù)雜度是O(n^3)。

在編寫過程中遇到了以下錯誤:
在62行
[Error]subscripted value is neither array nor pointer nor vector

意思是
下標的值不是數(shù)組或指針或向量
當時我這一行是這樣寫的
void ShortestPath_Floyd(MGraph G,int** P,int** D)
因為在上一篇文章Dijkstra算法中一維數(shù)組作為函數(shù)參數(shù)是用的int*,沒有問題
所以在這里二維數(shù)組我就想當然地用了int**
但是如果參數(shù)傳入int**類型,在函數(shù)里就不能使用P[v][w]訪問二維數(shù)組的值

編譯器不能正確為它尋址,需要模仿編譯器的行為把P[v][w]這樣的式子手工轉(zhuǎn)變?yōu)椋?/p>

     *((int*)P + n*v + w);

所以在被調(diào)用函數(shù)中對形參數(shù)組定義時可以指定所有維數(shù)的大小,也可以省略第一維的大小說明
故改為void ShortestPath_Floyd(MGraph G,int P[9][9],int D[9][9])就可以編譯通過。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++中運算符重載詳解及其作用介紹

    C++中運算符重載詳解及其作用介紹

    這篇文章主要介紹了C++中運算符重載詳解及其作用介紹,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C 語言實現(xiàn)一個簡單的 web 服務(wù)器的原理解析

    C 語言實現(xiàn)一個簡單的 web 服務(wù)器的原理解析

    這篇文章主要介紹了C 語言實現(xiàn)一個簡單的 web 服務(wù)器的原理解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • C語言中隊列的結(jié)構(gòu)和函數(shù)接口的使用示例

    C語言中隊列的結(jié)構(gòu)和函數(shù)接口的使用示例

    隊列只允許一端進行插入數(shù)據(jù)操作,在另一端進行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進先出FIFO的性質(zhì);隊列可用數(shù)組和鏈表 的方法實現(xiàn),使用鏈表的結(jié)構(gòu)實現(xiàn)更優(yōu)一些,因為如果使用數(shù)組節(jié),出隊列時刪去首元素需要將整個數(shù)組前移,效率比較低
    2023-02-02
  • 詳解C++中菱形繼承的原理與解決方法

    詳解C++中菱形繼承的原理與解決方法

    C++中的菱形繼承是多繼承的一種特殊情況,本文將通過海里帶大家了解一下菱形繼承形成的原因以及想應(yīng)的解決方法,感興趣的可以了解一下
    2023-02-02
  • VC++植物大戰(zhàn)僵尸中文版修改器實現(xiàn)代碼

    VC++植物大戰(zhàn)僵尸中文版修改器實現(xiàn)代碼

    這篇文章主要介紹了VC++植物大戰(zhàn)僵尸中文版修改器實現(xiàn)代碼,可實現(xiàn)植物大戰(zhàn)僵尸中的無限陽光與無冷卻時間功能,需要的朋友可以參考下
    2015-04-04
  • C++中std::is_object的具體使用

    C++中std::is_object的具體使用

    std::is_object是一種C++類型特性,其用途是判斷一個類型是否是一個對象類型,本文主要介紹了C++中std::is_object的具體使用,感興趣的可以了解一下
    2024-01-01
  • C++實現(xiàn)職工工資管理系統(tǒng)課程設(shè)計

    C++實現(xiàn)職工工資管理系統(tǒng)課程設(shè)計

    這篇文章主要為大家詳細介紹了C++實現(xiàn)職工工資管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 使用OpenCV檢測圖像中的矩形

    使用OpenCV檢測圖像中的矩形

    這篇文章主要為大家詳細介紹了使用OpenCV檢測圖像中的矩形,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 詳解C語言中scanf函數(shù)使用的一些注意點

    詳解C語言中scanf函數(shù)使用的一些注意點

    這篇文章主要介紹了C語言中scanf函數(shù)使用的一些注意點,scanf函數(shù)的使用是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-04-04
  • C++回文數(shù)及素數(shù)問題計算方法

    C++回文數(shù)及素數(shù)問題計算方法

    這篇文章主要介紹了C++回文數(shù)及素數(shù)問題計算方法,可實現(xiàn)一定范圍內(nèi)的素數(shù)與回文數(shù)運算功能,涉及C++字符串遍歷與數(shù)字數(shù)學(xué)運算的相關(guān)技巧,需要的朋友可以參考下
    2016-05-05

最新評論

兴海县| 磴口县| 商城县| 阳新县| 朔州市| 汉中市| 邵东县| 阳泉市| 合肥市| 朝阳县| 名山县| 宁安市| 东乌珠穆沁旗| 抚州市| 阿图什市| 鲁甸县| 宁强县| 天祝| 威宁| 夏河县| 迭部县| 灵寿县| 镇坪县| 平阳县| 息烽县| 冕宁县| 贵州省| 常宁市| 萨迦县| 禄丰县| 汤原县| 醴陵市| 遵化市| 正宁县| 仁寿县| 万州区| 河西区| 凌源市| 阳谷县| 桓台县| 莒南县|