Floyd算法的功能是通过一个图的权值矩阵求出它的每两点间的最短路径矩阵.
它的功能看上去挺强大的,但它的实现却很简单,和Washall算法很相似,也是一个三层循环,思路也是相似是,就是利用前面计算的结果:
如下:
if(Mk+1[i,j] > Mk[i,k+1]+Mk[k+1,j])then
Mk+1[i,j] = Mk[i,k+1]+Mk[k+1,j]
参Washall算法:
http://blog.csdn.net/emilmatthew/archive/2005/08/10/450048.aspx
好了,就讲这些了,相关的理论请参考相关的算法书籍.
void Floyd1(Type*** mapArr,int len,FILE* outputFile)
{
int i,j,k;/*iterator index*/
Type newLen;/*tmp shortest len*/
assertF(*mapArr!=NULL,"in Floyd1 *mapArr is NULL");
assertF(outputFile!=NULL,"in Floyd1 outputFile is NULL");
/*Algorithm Core Reason*/
if(Mk+1[i,j] > Mk[i,k+1]+Mk[k+1,j])
Mk+1[i,j] = Mk[i,k+1]+Mk[k+1,j]
*/
for(k=0;k<len;k++)
for(i=0;i<len;i++)
for(j=0;j<len;j++)
{
newLen=(*mapArr)[i][k]+(*mapArr)[k][j];
if(newLen<(*mapArr)[i][j])(*mapArr)[i][j]=newLen;
}
}
/*Floyd Algorithm test program*/
#include "Global.h"
#include "Ulti.h"
#include "SortAlgorithm.h"
#include "GraphAlgorithm.h"
#include "MyAssert.h"
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *inFileName="inputData.txt";
/*
input data specification
row,col
wArr
{
-1 will be replace with a very big data in program,means there no path between the two node
, , , ,
, , , ,
, , , ,
}
*/
char *outFileName="outputData.txt";
#define DEBUG 1
void main(int argc,char* argv[])
{
FILE *inputFile;/*input file*/
FILE *outputFile;/*output file*/
double startTime,endTime,tweenTime;/*time callopsed info*/
int row,col;
Type** wArr;
int i,j;/*iterator index*/
int n;/*arr deminision for squre matrix*/
/*input file open*/
if(argc>1)strcpy(inFileName,argv[1]);
assertF((inputFile=fopen(inFileName,"rb"))!=NULL,"input file error");
printf("input file open success\n");
/*outpout file open*/
if(argc>2)strcpy(outFileName,argv[2]);
assertF((outputFile=fopen(outFileName,"wb"))!=NULL,"output file error");
printf("output file open success\n");
fscanf(inputFile,"%d,%d,",&row,&col);
/*Memory apply*/
wArr=(Type**)malloc(sizeof(Type*)*row);
for(i=0;i<row;i++)
wArr[i]=(Type*)malloc(sizeof(Type)*col);
/*Read 2d arr data*/
for(i=0;i<row;i++)
{
for(j=0;j<col-1;j++)
fscanf(inputFile,"%d,",&wArr[i][j]);
fscanf(inputFile,"%d;",&wArr[i][j]);
}
/*big length adjust*/
for(i=0;i<row;i++)
for(j=0;j<col;j++)
if(wArr[i][j]==-1)wArr[i][j]=IntLimit;
show2DArr(wArr,row,col);
#if DEBUG
printf("\n*******start of test program******\n");
printf("now is runnig,please wait...\n");
startTime=(double)clock()/(double)CLOCKS_PER_SEC;
/******************Core program code*************/
/*argu prepare*/
assertF(col==row,"in test col!=row");
n=row;/*get the size of square matrix*/
Floyd1(&wArr,n,outputFile);
output2DArr(wArr,row,col,outputFile);
/******************End of Core program**********/
endTime=(double)clock()/(double)CLOCKS_PER_SEC;
tweenTime=endTime-startTime;/*Get the time collapsed*/
/*Time collapsed output*/
printf("the collapsed time in this algorithm implement is:%f\n",tweenTime);
fprintf(outputFile,"the collapsed time in this algorithm implement is:%f\r\n",tweenTime);
printf("\n*******end of test program******\n");
#endif
for(i=0;i<row;i++)
free(wArr[i]);
free(wArr);
printf("program end successfully,\n you have to preess any key to clean the buffer area to output,otherwise,you wiil not get the total answer.\n");
getchar();/*Screen Delay Control*/
return;
}
/*Test Result*/
//inputData, -1 will be replace with a very big data in program,means there no path between the two node
4,4,
0,1,-1,-1;
1,0,2,5;
-1,2,0,3;
-1,5,3,0;
//outputData
0,1,3,6;
1,0,2,5;
3,2,0,3;
6,5,3,0;