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 10 11 0
0 11 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過點的情況進行...