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<len;k++)
for(i=0;i<len;i++)
for(j=0;j<len;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 <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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<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]);
}
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<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 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;