O 矩陣相乘 Warshall演算法詳解

2021-08-20 16:11:58 字數 1505 閱讀 3834

給出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 00 1

0 11 0

sample output

0 1

1 0

離散裡面學到了warshall演算法

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

不過這個演算法是用來算傳遞閉包的,稍微改造了下

列如:0 0 1     0 01

10 0     1 0 1

0 1 0     0 1 1 相乘

則先檢索第乙個陣列裡的第一豎列 即arr1[i][1]  i遞增 看此位置是否是1

先假設arr為第一行,,第一列

此圖中 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 #include int arr1 [1010][1010];

int arr2 [1010][1010];

int arr3 [1010][1010];

int main()

for(int i=1;i<=n;i++)

for(int x=1;x<=n;x++)

for(int i=1;i<=n;i++)    

for(int x=1;x<=n;x++)//第x行,i列,先檢索行}} 

}for(int i=1;i<=n;i++)   //輸出

printf("\n");

} return 0;

}

Strassen矩陣相乘演算法

strassen的矩陣相乘方法是一種典型的分治演算法。目前為止,我們已經見過一些分治策略的演算法了,例如歸併排序和karatsuba大數快速乘法。現在,讓我再來看看分治策略的背後是什麼。同動態規劃不同,在動態規劃中,為了得到最終的解決方案,我們經常需要把乙個大的問題 展開 為幾個子問題,但是這裡,我...

演算法提高 矩陣相乘

問題描述 小明最近在為線性代數而頭疼,線性代數確實很抽象 也很無聊 可惜他的老師正在講這矩陣乘法這一段內容。當然,小明上課打瞌睡也沒問題,但線性代數的習題可是很可怕的。小明希望你來幫他完成這個任務。現在給你乙個 ai 行 aj 列的矩陣和乙個 bi 行 bj 列的矩陣,要你求出他們相乘的積 當然也是...

演算法導論 矩陣相乘(一)

矩陣的相乘,這個計算方法就直接看下面的原始碼實現 void mul array int a array array size int b array array size int c array array size int size 這個是最暴力的方法,演算法本身就是按照定義來進行計算的,這裡提一...