O-矩阵相乘-Warshall算法详解

给出2个N * N的矩阵M1和M2,输出2个矩阵相乘后的结果。

Input第1行:1个数N,表示矩阵的大小(2 <= N <= 100) 
第2 - N + 1行,每行N个数,对应M1的1行(0 <= M1ii <= 1000) 
第N + 2 - 2N + 1行,每行N个数,对应M2的1行(0 <= M2ii <= 1000)Output输出共N行,每行N个数,对应M1 * M2的结果的一行。Sample Input

2
1 0
0 1
0 1
1 0

Sample Output

0 1
1 0

离散里面学到了Warshall算法

也不管简便不简便就直接用了

不过这个算法是用来算传递闭包的,稍微改造了下

列如:

         0 0 1     0 0 1

         1 0 0     1 0 1

         0 1 0     0 1 1 相乘

  则先检索第一个数组里的第一竖列 即arr1[i][1]  i递增 看此位置是否是1

先假设arr【1】【1】为第一行,,第一列

  此图中 i为2时arr1[2][1]为1,即(2,1),

  根据传递性,在第二个数组中寻找( 1,x)位置为1的元素

   即x=3 ,arr2[1][3]为1,(2,1)(1,3)则传递为(2,3)

  于是将arr3空数组中位置为2,3的元素置1,然后再检索第二竖列

,以此类推

         0 0 1     0 0 1

         1 0 0     1 0 1

         0 1 0     0 1 1

   (3,2)->(2,1),(2,3)传递成(3,1)(3,3),将arr3[][]对应位置置1。。。。。

此代码将检索1改为检索是否为0

将arr3【】【】中传递的来的元素累加成传递前两个数的乘积

#include <iostream>
#include <cstdio>
int arr1 [1010][1010];
int arr2 [1010][1010];
int arr3 [1010][1010];
  int main() {
               int n,a;
               scanf("%d",&n);
               for(int i=1;i<=n;i++)       //传值
                     for(int x=1;x<=n;x++)
                    {
                     scanf("%d",&a);
                     arr1[i][x]=a;
                  }
             for(int i=1;i<=n;i++)
                for(int x=1;x<=n;x++)
                 {
                  scanf("%d",&a);
                  arr2[i][x]=a;
                  }

for(int i=1;i<=n;i++)    
                for(int x=1;x<=n;x++)//第x行,i列,先检索行
                  {
                   if(arr1[x][i]!=0)//找到不为0的数arr【x】【i】
                   {
                        for(int z=1;z<=n;z++)  //寻找arr【i】【】
                         {
                           if(arr2[i][z]!=0)    //找到arr【i】【z】
                          {
                             arr3[x][z]+=arr1[x][i]*arr2[i][z];//累加
                         }
                        }
                     } 
                   }
                 for(int i=1;i<=n;i++)   //输出
                 {
                     for(int x=1;x<=n;x++)
                      {
                        if(x!=n)
                        printf("%d ",arr3[i][x]);
                        else
                        printf("%d",arr3[i][x]);
                    }
                        printf("\n");
                 } 
                      return 0;
               }


 

猜你喜欢

转载自blog.csdn.net/lioncatch/article/details/80659686