windy在有向圖中迷路了。 該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在 t 時刻到達節點 n-1。 現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎? 注意:windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。
第一行包含兩個整數,n t。 接下來有 n 行,每行乙個長度為 n 的字串。 第i行第j列為』0』表示從節點i到節點j沒有邊。 為』1』到』9』表示從節點i到節點j需要耗費的時間。
包含乙個整數,可能的路徑數,這個數可能很大,只需輸出這個數除以2009的餘數。
【輸入樣例一】
2 2
11 00
【輸入樣例二】
5 30
12045
07105
47805
12024
12345
【輸出樣例一】
【樣例解釋一】
0->0->1
【輸出樣例二】
30%的資料,滿足 2 <= n <= 5 ; 1 <= t <= 30 。 100%的資料,滿足 2 <= n <= 10 ; 1 <= t <= 1000000000 。
設圖的鄰接矩陣為
a 。在不考慮邊權(或者邊權都為1)的時候,an
中的元素an
i,j 也表示i到j經過n條邊(路徑長度為n)的方案數。
為什麼呢?我們用歸納法證明。
因為當n=1
時顯然成立,然後對於任意
n>
1 ,有an
=an−
1∗a ,則對於an
中每個元素,有 an
i,j=
∑an−
1i,k
∗ak,
j 如果性質在an
−1中成立,那麼an
i,j 就表示i到k經過n-1條邊的方案總數×k到j經過1條邊的方案總數,結果就是i到j經過n條邊的方案總數,所以an
符合性質,即如果an
−1滿足性質,那麼an
滿足性質。所以命題得到證明。
所以當題目中的圖中邊權全都是1的時候,0到n-1號節點走過邊權為m的答案就是am
0,n−
1 。
現在我們想辦法把圖中邊權變為1。
不難想到拆點:(圖中是1到2有一條邊權為5的邊的情況)
這樣圖中所有邊權都化為1,構出新圖的鄰接矩陣然後快速冪即可。
**:
#include#include#includeusing namespace std;
const int maxn=105,mod=2009;
struct matrix
}temp,i;
int n,t,size;
char s[maxn];
matrix cheng(matrix x,matrix y)}}
return re;
}matrix
pow(matrix x,int y)
return re;
}int main()
}size=n*9;
for(int i=0;i
for(int i=0;i"\n%s",s);
for(int j=0;jif(s[j]>'0')}}
temp=pow(temp,t);
printf("%d\n",temp.a[0][n-1]);
return
0;}
BZOJ1297 SCOI2009 迷路 題解
windy在有向圖中迷路了。該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在t 時刻到達節點 n 1。現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎?注意 windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。思考當邊權為1時,a i j 1可以表示為i到...
題解 bzoj1066 SCOI2007 蜥蜴
在乙個r行c列的網格地圖中有一些高度不同的石柱,一些石柱上站著一些蜥蜴,你的任務是讓盡量多的蜥蜴逃 到邊界外。每行每列中相鄰石柱的距離為1,蜥蜴的跳躍距離是d,即蜥蜴可以跳到平面距離不超過d的任何乙個石 柱上。石柱都不穩定,每次當蜥蜴跳躍時,所離開的石柱高度減1 如果仍然落在地圖內部,則到達的石柱高...
BZOJ4571 SCOI2016 美味 題解
一家餐廳有 n 道菜,編號 1.n 大家對第 i 道菜的評價值為 ai 1 i n 有 m 位顧客,第 i 位顧客的期望值為 bi,而他的偏好值為 xi 因此,第 i 位顧客認為第 j 道菜的美味度為 bi xor aj xi xor 表示異或運算。第 i 位顧客希望從這些菜中挑出他認為最美味的菜,...