[图算法]Washall算法

Washall算法可由一个图的邻接矩阵求它的可达矩阵,形式上很简单,就是一个三层循环,

要理解意思也不难.

      首先,如果不用Washall算法,求由一个图的邻接矩阵(M)求它的可达矩阵(Mt)可以通过下式来做:

       Mt=M+M^2+….+M^n;

       这是很好理解的,不明白的请看图论方面的书.

       Washall算法提供了另一种思考方式,也就是利用Mk的结果来计算Mk1

最关键的式子,分两种情况:

       1)如果Mk+1[I,j]已经是1,那自然不用去算了.

       2)而要算计算情况就是由Mk[i,k+1]=1&&Mk[k+1,j]=1à Mk+1[i,j]=1

       好了,就讲这些了.真正的理论细节还请参考相关的书籍.

       /*Washall Algorithm

                                          Coded by EmilMatthew 05/8/10

     Here ,the datastructure is using the datastructure map to implement.

*/

void Washall1(Type*** mapArr,int len,FILE* outputFile)

       {

              int i,j,k;/*iterator index*/

              assertF(*mapArr!=NULL,"in Washall1 *mapArr is NULL");

           assertF(outputFile!=NULL,"in Washall1 outputFile is NULL");

              /*Algorithm Core Reason*/

              /*Mk+1[i,j]=1 <-> Mk[i,k+1]=1&&Mk[k+1,j]=1*/

              for(k=0;k

                     for(i=0;i

                            for(j=0;j

                            {

                                   (*mapArr)[i][j]=(*mapArr)[i][j]||(*mapArr)[i][k]&&(*mapArr)[k][j];

                            }

       }

 

/*Washall Algorithm test program*/

#include "Global.h"

#include "Ulti.h"

#include "SortAlgorithm.h"

#include "GraphAlgorithm.h"

#include "MyAssert.h"

#include

#include

#include

#include

 

 

char *inFileName="inputData.txt";

/*

       input data specification

       row,col

       wArr

       {

              , , , ,       

              , , , ,

              , , , ,

       }

*/

 

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

              wArr[i]=(Type*)malloc(sizeof(Type)*col);

             

       /*Read 2d arr data*/

       for(i=0;i

       {

              for(j=0;j

                     fscanf(inputFile,"%d,",&wArr[i][j]);

              fscanf(inputFile,"%d;",&wArr[i][j]);         

       }    

             

       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*/

              Washall1(&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

                            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 Data

//Input data

4,4,

0,1,0,0;

1,0,1,0;

0,0,0,1;

0,1,0,0;

 

//Outpout Data

1,1,1,1;

1,1,1,1;

1,1,1,1;

1,1,1,1;

 

 

你可能感兴趣的:(算法,algorithm,output,file,iterator,input)