传递闭包的warshall算法

#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.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值