---恢復內容開始---
題目描述
windy 在有向圖中迷路了。 該有向圖有 nnn 個節點,windy 從節點 000 出發,他必須恰好在 ttt 時刻到達節點 n−1n-1n−1。
現在給出該有向圖,你能告訴 windy 總共有多少種不同的路徑嗎?
注意:windy 不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。
輸入格式
第一行包含兩個整數,n,tn,tn,t;
接下來有 nnn 行,每行乙個長度為 nnn 的字串。第 iii 行第 jjj 列為0
表示從節點 iii 到節點 jjj 沒有邊,為1
到9
表示從節點 iii 到節點 jjj 需要耗費的時間。
輸出格式
包含乙個整數,可能的路徑數,這個數可能很大,只需輸出這個數除以 200920092009 的餘數。
樣例樣例輸入 1
2 2
1100
樣例輸出 1
1
樣例說明 1
0→0→10\to 0\to 10→0→1
樣例輸入 2
5 30
12045
07105
47805
12024
12345
樣例輸出 2
852
資料範圍與提示
對於 30%的資料,滿足 2≤n≤5,1≤t≤30
對於 100%的資料,滿足 2≤n≤10,1≤t≤10^9……9。
思路:這題可以說是一種定理題,在矩陣中,乙個存i到j路徑數的矩陣自乘k次,a[i][j]表示從i到j走k步的路徑數。我們來證明一下,其實仔細理解一下矩陣乘,c[i][j]+=a[i][k]*b[k][j],一寫出來就明朗了,列舉乙個中間點,用乘法原理,i到j兩步的路徑數等於i到k一步的路徑數乘k到j一步的路徑,然後再對於不同的中間點用加法原理,這一定是正確並且全面的,每次都列舉了i能到的所有點,以及能到j的所有點,k步就顯然一樣。然後會發現這道題並沒有被解決,因為他的邊權可能為1~9,如果直接存進矩陣的話,存邊權顯然是不可取的,它表示有邊權數條路徑,存1好像成了一步就能到。正解是把乙個點拆成9個點,可以認為搞乙個9進製,然後進行連邊,具體實現不好敘述,大概是這樣
for(int i=1;i)然後就可以保證邊權是k的時候能夠正確處理。a.a[x*9+i][x*9+i+1]=1
; a.a[x*9+d][y*9+1]=1;
#include#include醜的要死的沒有過載運算子的**#define ll long long
using
namespace
std;
const
int mod=2009
;struct nodea,ans;
ll n,t;
void cheng(node a,node b,node &c)
}void
qpow(node a,ll b)
}void add(int x,int y,int
d)int
main()
ans=a;
qpow(a,t-1
);//
for(int i=1;i<=(n-1)*9+1;i++)
// cout<0*9+1][(n-1)*9+1
];
}
To Heart 題解 SCOI2009迷路
題解第二部分 原題來自 scoi 2009 windy 在有向圖中迷路了.該有向圖有 n nn個節點,windy 從節點 0 00 出發,他必須恰好在t tt時刻到達節點 n 1 n 1n 1。現在給出該有向圖,你能告訴 windy 總共有多少種不同的路徑嗎?注意 windy 不能在某個節點逗留,且...
題解 bzoj1297 SCOI2009 迷路
windy在有向圖中迷路了。該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在 t 時刻到達節點 n 1。現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎?注意 windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。第一行包含兩個整數,n t。接下來有 n 行...
BZOJ1297 SCOI2009 迷路 題解
windy在有向圖中迷路了。該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在t 時刻到達節點 n 1。現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎?注意 windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。思考當邊權為1時,a i j 1可以表示為i到...