欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

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

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊: 次

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

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

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

#include <stdio.h> 
            
#define INFINITY 65535 
 
typedef int VertexType; //頂點(diǎn)是字符型 
typedef int EdgeType; //邊是整型 
typedef struct //圖的鄰接矩陣存儲(chǔ)結(jié)構(gòu) 
{ 
 
 VertexType vexs[9]; //頂點(diǎn)向量 
 
 EdgeType edges[9][9];  //鄰接矩陣 
 
 int vexnum,arcnum; //圖中當(dāng)前的頂點(diǎn)數(shù)和邊數(shù) 
 
}MGraph; 
 
/* 鄰接矩陣的建立*/ 
 
void CreateGraph(MGraph *G) 
{  
 int i,j,k,weight; 
 int ch1,ch2; 
 
 printf("請(qǐng)輸入頂點(diǎn)數(shù)和邊數(shù)(輸入格式為:頂點(diǎn)數(shù),邊數(shù)):"); 
 
 scanf("%d,%d",&(G->vexnum),&(G->arcnum)); 
 
 printf("請(qǐng)輸入頂點(diǎn)名稱(輸入格式為: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("請(qǐng)輸入每條邊對(duì)應(yīng)的兩個(gè)頂點(diǎn)名稱(輸入格式為:a,b):\n"); 
 
  for(k=0;k<G->arcnum;k++) 
  { 
   // getchar(); 
   printf("請(qǐng)輸入第%d條邊的兩個(gè)頂點(diǎn)名稱:",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("請(qǐng)輸入第%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)過(guò)下標(biāo)為k頂點(diǎn)路徑比原兩點(diǎn)間路徑更短,將當(dāng)前兩點(diǎn)間權(quán)值設(shè)為更小的一個(gè) 
    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); 
  } 
 } 
} 

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


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

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

意思是
下標(biāo)的值不是數(shù)組或指針或向量
當(dāng)時(shí)我這一行是這樣寫的
void ShortestPath_Floyd(MGraph G,int** P,int** D)
因?yàn)樵谏弦黄恼翫ijkstra算法中一維數(shù)組作為函數(shù)參數(shù)是用的int*,沒(méi)有問(wèn)題
所以在這里二維數(shù)組我就想當(dāng)然地用了int**
但是如果參數(shù)傳入int**類型,在函數(shù)里就不能使用P[v][w]訪問(wèn)二維數(shù)組的值

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:OpenCV實(shí)現(xiàn)人臉檢測(cè)

欄    目:C語(yǔ)言

下一篇:Opencv基于CamShift算法實(shí)現(xiàn)目標(biāo)跟蹤

本文標(biāo)題:C語(yǔ)言實(shí)現(xiàn)圖的最短路徑Floyd算法

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1003.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有