#include<stdio.h>
#define MATRIX_SIZE 5
void Warshall_Algorithm(int matrix[][MATRIX_SIZE],int N);
int main()
{
int warshall[MATRIX_SIZE][MATRIX_SIZE]={0,1,0,0,1,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,0,1,0,1,0};
/*以下部分是自己输入关系矩阵 的值,但是其值仅限于0 or1
for(int i=0;i<MATRIX_SIZE;tt++){
printf("please input %dth row's digits\n",i);
for(int j=0;j<MATRIX_SIZE;pp++)
scanf("%d",&warshall[i][j]);}*/
Warshall_Algorithm(warshall,MATRIX_SIZE);
for(int tt=0;tt<MATRIX_SIZE;tt++){
printf("\n");
for(int pp=0;pp<MATRIX_SIZE;pp++)
printf(" %d ",warshall[tt][pp]);}
getchar();
}
void Warshall_Algorithm(int matrix[][MATRIX_SIZE],int N)
{
for(int i=0;i<N;i++)
for(int j=0;j<N;j++){
if(matrix[i][j]==1){
for(int k=0;k<N;k++){
if(matrix[j][k]==1)
matrix[i][k]=1;}}}
}
来自于:http://cs.bnu.edu.cn/~fxshen/discrete_math/teach%20content4.8.htm
Warshall算法
计算关系R的传递闭包的算法。
设A={ a1,a2,……,an},R是A上关系。定义矩阵WK=[tij]如下:tij=1当且仅当从ai到aj有一条路径,经过的顶点在{a1,a2,…,ak}之中。
W0=MR.Wn= MR∞.
设已有Wk-1=[sij],计算WK=[tij]:
tij=1
当且仅当
(1) sij=1
//ai到aj有路径中间点在
{a1,a2,…,ak-1}之中。
或
(2) sik=1且skj=1.
//ai到aj有路径经过ak,其余中间
点在{a1,a2,…,ak-1}之中。
Wk-1的元素a1k乘ak1加到a11
元素a1k乘ak2加到a12
……
元素a1k乘akn加到a1n
元素a2k乘ak1加到a21
元素a2k乘ak2加到a22
……
元素a2k乘akn加到a2n
……
……
元素ank乘ak1加到an1
元素ank乘ak2加到an2
……
元素ank乘akn加到ann
Wk-1第k列的元素遍乘第k行的元素加到矩阵Wk-1
Algorithm Warshall
1. Closure←Mat
2. ForK=1 Thro N
a.For I=1 Thro N
1.For J=1 Thro N
a.Closure[I,J]←Closure[I,J]∨Closure[I,K]∧ Closure[K,J]。
End of AlgorithmWarshall
例2. W0=MR=
k=1,第1列的元素遍乘第1行的元素加到W0
W1=
k=2,第2列的元素遍乘第2行的元素加到W1
W2=
k=3,第3列的元素遍乘第3行的元素加到W2
W3=
k=4,第4列的元素遍乘第4行的元素
加到W3,第4行的元素全0。
W4= W3
MR∞=W3.