不用說這兩位都是冷門演算法……畢竟o(n^3)的時間複雜度演算法在演算法競賽裡基本算是被淘汰了……而且也沒有在這個演算法上繼續衍生出其他的演算法…
有興趣的話:click here..
話說學離散的時候曾經有個把warshall演算法簡化到1/2時間的想法……不過懶得去翻了,現在想想本來這兩個不用矩陣而用位運算的話速度不知道比我那個方法快多少倍……
之前在學離散的時候還是花了點時間來研究這個演算法的,但是仔細看了下書上的就發現和書上寫的有些不一樣,下面講講我知道的那種和書上的那種:
我知道的那種:
將有向圖的鄰接矩陣進行相乘操作,每乘一次儲存結果,原本的矩陣稱為r(1),再乘以r(1)稱為r(2),再乘以r(1)稱為r(3)…直到取到r(n-1)為止。將r1….rn-1取並,得出相連矩陣結果。
原理,易證,將鄰接矩陣相乘所得為比當前路線高一階的相連矩陣,假設r1為所有路徑為1的通路,那麼r2就是所有路徑為2的通路。。。rn-1就是所有路徑為n-1的通路。因為只有n個節點,假設求得路線不存在環,那最多為n-1長度,可從之前結果獲得,假設存在環,那麼環的結果再之前便已經取得。無論怎樣,其並結果絕對包含所有節點的鏈結關係。
書上新看到的:
for k in vertex
for i in row
for j in col
如果點i,k.col存在相連關係,k.row,j存在相連關係,那麼這個點就是可以被連上的。
同樣的,floyd也是這個尿性,不過裡面得改一下:
若能相連,看看是不是比現在的值小,小的就換上。
嘛,怎麼說肯定不是很理解,所以我就用例子說明一下把:
這樣的一張圖,鄰接矩陣的樣式為:
a b c d
a 0 n 3 n
b 2 0 n n
c n 7 0 1
d 6 n n 0
布林值的樣式是:
a b c d
a 0 n 1 n
b 1 0 n n
c n 1 0 1
d 1 n n 0
那麼,warshall的做法是,先統計第1行和第1列,發現(d,c)列對應的(a,c)(第一行),和(d,a)(第一列)都為1,則(d,c)變為1,同理,(b,c)變為1,那麼第一輪的結果是:
a b c d
a 0 n 1 n
b 1 0 1 n
c n 1 0 1
d 1 n 1 0
第二輪:
a b c d
a 0 n 1 n
b 1 0 1 n
c 1 1 1 1
d 1 n 1 0
第三輪:
a b c d
a 1 1 1 1
b 1 1 1 1
c 1 1 1 1
d 1 1 1 1
至此,已經沒有進行第四輪的必要,故這是乙個全通圖。floyd的思路與其類似,不過是判斷是否兩個關聯值加起來是否小於當前值,小於的話那就更新,不然不更新。
Warshall演算法和Floyd演算法
不用說這兩位都是冷門演算法 畢竟o n 3 的時間複雜度演算法在演算法競賽裡基本算是被淘汰了 而且也沒有在這個演算法上繼續衍生出其他的演算法 話說學離散的時候曾經有個把warshall演算法簡化到1 2時間的想法 不過懶得去翻了,現在想想本來這兩個不用矩陣而用位運算的話速度不知道比我那個方法快多少倍...
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個數,對應...
Warshall演算法 未完成版4 6
a是乙個基數為n的集合,r是a上的乙個關係,則有r r r 2 r3 r n 換句話說,計算不需要用到r的n次以上的冪。a,b是a中的元素,假設是r中一條從a到b的路,那麼都在r中。如果和是同乙個頂點,約定j i,那麼這段路能被劃分為三個部分。第一段從a到,第二段從到,第三段從到b。中間的第二段是個...