C語言實現(xiàn)Floyd算法
更新時間:2018年01月03日 14:00:37 作者:礪晗
這篇文章主要為大家詳細介紹了C語言實現(xiàn)Floyd算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C語言實現(xiàn)Floyd算法的具體代碼,供大家參考,具體內(nèi)容如下
#include <stdio.h> #include <stdlib.h> #include <limits.h> #define NUM 4 typedef struct MGraph /* 鄰接表存儲結(jié)構(gòu) */ { int edges[NUM][NUM]; int n,e; } MGraph; MGraph *build_mgraph(); void Floyd(MGraph *mgraph); void Ppath(int path[][NUM], int i, int j); void Dispath(int A[][NUM], int path[][NUM], int n); int main(void) { MGraph *mgraph; printf("\n*************************************************************\n"); printf("該圖的矩陣表示為:\n"); mgraph=build_mgraph(); printf("\n*************************************************************\n"); printf("各頂點間最短路徑為:\n"); Floyd(mgraph); printf("\n*************************************************************\n"); return 0; } MGraph *build_mgraph() { int i,j; int num_e=0; MGraph *mgraph=(MGraph *)malloc(sizeof(MGraph)); int matrix[NUM][NUM]={{0,5,INT_MAX,7}, {INT_MAX,0,4,2}, {3,3,0,2}, {INT_MAX,INT_MAX,1,0}}; for(i=0;i<NUM;i++) { for(j=0;j<NUM;j++) { mgraph->edges[i][j]=matrix[i][j]; if(matrix[i][j]!=0 && matrix[i][j]!=INT_MAX) num_e++; } } mgraph->n=NUM; mgraph->e=num_e; printf("node=%d;edges=%d\n",mgraph->n,mgraph->e); for(i=0;i<NUM;i++) { for(j=0;j<NUM;j++) { if(mgraph->edges[i][j]!=INT_MAX) printf("%3d",mgraph->edges[i][j]); else printf("%3c",'&'); } printf("\n"); } return mgraph; } void Floyd(MGraph *mgraph) { int A[NUM][NUM],path[NUM][NUM]; int i,j,k; for(i=0;i<mgraph->n;i++) { for(j=0;j<mgraph->n;j++) { A[i][j]=mgraph->edges[i][j]; path[i][j]=-1; } } for(k=0;k<mgraph->n;k++) { for(i=0;i<mgraph->n;i++) { for(j=0;j<mgraph->n;j++) { if(A[i][k]!=INT_MAX && A[k][j]!=INT_MAX && A[i][j]>A[i][k]+A[k][j]) { A[i][j]=A[i][k]+A[k][j]; path[i][j]=k; } } } } Dispath(A,path,mgraph->n); } void Ppath(int path[][NUM], int i, int j) { int k; k=path[i][j]; if(k==-1) return; Ppath(path,i,k); printf("%d,",k); Ppath(path,k,j); } void Dispath(int A[][NUM], int path[][NUM], int n) { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(A[i][j]==INT_MAX) printf("%d-%d have no path",i,j); printf("%d-%d-%d: ",i,j,A[i][j]); printf("%d,",i); Ppath(path,i,j); printf("%d\n",j); } } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實現(xiàn)選擇排序、冒泡排序和快速排序的代碼示例
這篇文章主要介紹了C++中實現(xiàn)選擇排序、冒泡排序和快速排序的代碼示例,例子帶有執(zhí)行時間統(tǒng)計還可以簡單看一下效率對比,需要的朋友可以參考下2016-04-04C++利用opencv實現(xiàn)單目測距的實現(xiàn)示例
本文主要介紹了C++利用opencv實現(xiàn)單目測距的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11