t044 弗洛伊德

2021-09-28 10:05:21 字數 1210 閱讀 5347

time limit: 1 second

memory limit: 128 mb

弗洛伊德是乙個大牛!給乙個有向圖g,他有n個結點,現在請你求出對於他的每一對結點(x,y),從x出發走恰好k條邊以後恰

好到達結點y的路徑條數。 

輸入檔案第一行包含兩個正整數n,k。(1<=n<=50,1<=k<=100)

接下來n行,每行n個用空格隔開的數。若第i行第j個數為1,則表示i到j在g中有一條邊直接相連,若為0,則沒有邊直接相

連。 輸出檔案包含n行,每行n個用空格隔開的數。表示從i出發走恰好k條邊到達j的方案數。為了避免數字太大,請將所有數對8000取模。

2 1

0 11 0

0 1

1 0

【題解】

可以驗證一下

3 20 1 0

0 0 1

0 0 0

->

0 0 1

0 0 0

0 0 0

表示只有一條路徑從1到3是恰好走2格的。

答案就是改矩陣的k次方。

加乙個快速冪就能過了。

和普通的乘法運算不同。

矩陣乘法的快速冪,退出條件為now<=1;而不是now=0;

因為now=1的時候沒有必要再進行乘法運算了。因為一開始的初始狀態就對於矩陣的1次方。

再乘會錯解;

【**】

#include const int maxn = 51;

const int mod = 8000;

int n, k,a[maxn][maxn],temp[maxn][maxn],temp1[maxn][maxn];

void input_data()

}void solve(int now)

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

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

temp[i][j] = temp1[i][j];

if ((now %2)==1)

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

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

temp[i][j] = temp1[i][j]; }}

void output_ans()

}int main()

弗洛伊德演算法

弗洛伊德演算法 floyd 又稱為是插點法。目的是求加權圖中頂點中最短路徑的方法。本文通過舉例子的方法想你具體解釋何為弗洛伊德演算法。有乙個送禮物的問題,是csdn上的乙個題目,題目的詳情是這樣的。hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外...

弗洛伊德演算法

floyd演算法詳解 求解任意兩點間的最短距離 floyd warshall演算法,簡稱floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為o n 3 我們平時所見的floyd演算法的一般形式如下 1void floyd 注意下第6行這個地方,如果dist i k 或者dist k j 不存...

弗洛伊德演算法

弗洛伊德演算法 求任意一點i到任意一點j的最短路。分析 求i到j的最短路,大可以使用群舉法,因為點都是離散的,i到j的路徑是有限的,所以一定可以通過群舉法得到最短路,但群舉法卻沒太大意義,他的意義在於 把群舉法 通過修改 進行分類,得到好的演算法。flod演算法的分類標準是 通過i到j過點的情況進行...