1297 SCOI2009 迷路 矩陣乘法

2022-09-14 16:30:24 字數 1447 閱讀 3408

windy在有向圖中迷路了。 該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在 t 時刻到達節點 n-1。 現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎? 注意:windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。

第一行包含兩個整數,n t。 接下來有 n 行,每行乙個長度為 n 的字串。 第i行第j列為'0'表示從節點i到節點j沒有邊。 為'1'到'9'表示從節點i到節點j需要耗費的時間。

包含乙個整數,可能的路徑數,這個數可能很大,只需輸出這個數除以2009的餘數。

【輸入樣例一】

2 211

00【輸入樣例二】

5 30

12045

07105

47805

12024

12345

【輸出樣例一】

1【樣例解釋一】

0->0->1

【輸出樣例二】

85230%的資料,滿足 2 <= n <= 5 ; 1 <= t <= 30 。 100%的資料,滿足 2 <= n <= 10 ; 1 <= t <= 1000000000 。

這個題的思路真的妙啊……

主要還是我的問題,對矩陣乘法和鄰接矩陣理解不夠

有乙個很重要的事情:鄰接矩陣只有在邊權為1的時候才能用矩乘!

而我卻沒有認真閱讀資料範圍,想當然的把原鄰接矩陣做了矩乘

其實正解也近乎裸題

因為兩點間若能到達,距離必定為1~9

那麼我們就把乙個點化為9個點

例如點1化為1~9點

點2化為10~18點

…………

樣例便如下

1→2→3→4→5→6→7→8→9

↘10

最後r.a[1][10]即為所求結果

1 #include2 #include3 #include4

#define mod (2009)

5using

namespace

std;

6struct

mar7

r,unit;

10int

n,t;

11mar mul(mar a,mar b)

1221

22 mar mar_pow(mar a,int

p)23

32return

ans;33}

34int

main()

3548}49

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

50for (int j=1;j<=8;++j)

51 r.a[i*9-9+j][i*9-9+j+1]=1

;52 n*=9

;53 r=mar_pow(r,t);

5455 printf("

%d",r.a[1][n-8

]);56 }

題解 bzoj1297 SCOI2009 迷路

windy在有向圖中迷路了。該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在 t 時刻到達節點 n 1。現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎?注意 windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。第一行包含兩個整數,n t。接下來有 n 行...

B1297 SCOI2009 迷路 矩陣

這個題我覺得很有必要寫一篇部落格。首先,我們需要知道,假如乙個鄰接矩陣只有0 1構成,那麼它自己的n次方就是走n步之後的方案數。但這個題還有2 9咋辦呢。我們觀察發現,這個題只有10個點,而且邊權 9我們可以想到拆點這個小操作。把每個點拆成9個點,點內連1的邊,點外分別連到相應的權值就行了。題幹 w...

BZOJ1297 SCOI2009 迷路 題解

windy在有向圖中迷路了。該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在t 時刻到達節點 n 1。現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎?注意 windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。思考當邊權為1時,a i j 1可以表示為i到...