傳送門
輸入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到...