SCOI2009 迷路 題解

2022-03-27 03:32:53 字數 1784 閱讀 4570

---恢復內容開始---

題目描述

windy 在有向圖中迷路了。 該有向圖有 nnn 個節點,windy 從節點 000 出發,他必須恰好在 ttt 時刻到達節點 n−1n-1n−1。

現在給出該有向圖,你能告訴 windy 總共有多少種不同的路徑嗎?

注意:windy 不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。

輸入格式

第一行包含兩個整數,n,tn,tn,t;

接下來有 nnn 行,每行乙個長度為 nnn 的字串。第 iii 行第 jjj 列為0表示從節點 iii 到節點 jjj 沒有邊,為19表示從節點 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)

a.a[x*9+i][x*9+i+1]=1

; a.a[x*9+d][y*9+1]=1;

然後就可以保證邊權是k的時候能夠正確處理。

#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到...