warshall算法
warshall算法介绍
Warshall在1962年提出了一个求关系的传递闭包的有效算法。其具体过程如下,设在n个元素的有限集上关系R的关系矩阵为M:
(1)置新矩阵A=M;
(2)置i=1;
(3)对所有j如果A[j,i]=1,则对k=1…n执行:
A[j,k]=A[j,k]∨A[i,k];
(4)i加1;
(5)如果i≤n,则转到步骤(3),否则停止。
所得的矩阵A即为关系R的传递闭包t®的关系矩阵。
举个小例子
- 输入矩阵M
1 1 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 0 0
0 1 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0 - 输出传递闭包
1 1 0 1 0 0 0
0 1 0 1 0 0 0
0 0 0 0 1 0 0
0 1 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
来看看warshall算法具体的代码实现(C语言)
#include<string.h>
#include<stdio.h>
int M[10][10];
int main(){
freopen("in.txt","r",stdin);//文件输入
// freopen("out","w",stdout);//文件输出
void jiexijuzheng(int n);
memset(M,0,sizeof(M));
int a1,i,j;
printf("输入个数:\n");
scanf("%d",&a1);
printf("输入矩阵 :\n");
for(i=0;i<a1;i++) //输入矩阵
for(j=0;j<a1;j++) {
scanf("%d",&M[i][j]);
}
jiexijuzheng(a1);
printf("传递闭包:\n");
for(i=0;i<a1;i++){
for(j=0;j<a1;j++){
printf("%2d",M[i][j]);}
printf("\n");
}
return 0;
}
void jiexijuzheng(int n){
int i,j,k;
for(i=0;i<n;i++){ //warshall算法的核心代码部分
for(j=0;j<n;j++){
if(M[j][i]>=1){
for(k=0;k<n;k++){
M[j][k]=M[j][k]+M[i][k];
}
}
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(M[i][j]>1)M[i][j]=1;
}}
}
总结
总的来讲这个warshall算法还是挺好实现的,算法翻译没啥障碍