BZOJ1297 迷路 矩陣的冪

2022-06-01 07:15:10 字數 1124 閱讀 5928

傳送門

輸入n(點的數量),t(時間),和乙個n*n的矩陣,第i行第j列表示第i個節點到第j個節點有一條matrix[i]j時間的邊,若為0則沒有邊,問從1到n恰好經過t時間的方案數有多少種?

矩陣的冪與路徑的聯絡:若i到j有一條邊權為1的邊,那麼matrix[i][j]=1,\(matrix^k\)中的[1][n]即代表1到n距離恰好k的方案數(同樣也可以表示:i到j有一條邊,1到n的經過邊數恰好為k的方案數。)

這道題目簡化後是:知道i到j有邊權為1的邊,求x到y的距離為k的方案總數,正是上面提到的。

加上邊權後不能套用上邊直接求解,因為上面的做法只針對權值為1。但由於一條邊的權值只從0~9,那麼可以將乙個點拆成9個點,若i到j有一條邊權為k的邊,就相當於從i拆出的第k個節點向j拆出的第1個點連邊,i拆出的點之間連邊權為1的邊,這樣\(matrix^t\)的[getkth(i, 1)][getkth(n, 1)]即表示方案數。(getkth表示i拆出的第j個點)

#includeusing namespace std;

namespace io

inline void wr(int x)

}using namespace io;

const int n = 15, mod = 2009;

int n, t;

struct node

inline void init()

inline void set(int p, int q, int z)

inline void i()

inline node operator * (const node &p) const

return ret;

}inline node operator ^ (int tt)

}matrix, ret;

inline int getkth(int x, int k)

int main()

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

}ret = matrix ^ t;

wr(ret.b[getkth(1, 1)][getkth(n, 1)]);

return 0;

}

BZOJ 1297 矩陣乘法

這道題的意思是給出一張有向帶權圖,求出兩點間路徑長度為t的路徑條數。首先我們先考慮權值全部為1的情況,當權值全部為1時,答案即為該圖鄰接矩陣的t次冪,證明大概與floyad的證明類似,利用乘法原理,因為i和j連通,f i j 就等於1,而做一次矩陣乘法就意味著走了1步的方案數,而等於f i j 0的...

題解 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到...