[图算法]Floyd算法

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值