這道題的意思是給出一張有向帶權圖,求出兩點間路徑長度為t的路徑條數。首先我們先考慮權值全部為1的情況,當權值全部為1時,答案即為該圖鄰接矩陣的t次冪,證明大概與floyad的證明類似,利用乘法原理,因為i和j連通,f[i][j]就等於1,而做一次矩陣乘法就意味著走了1步的方案數,而等於f[i][j]=0的情況,在矩陣乘法中對答案沒有影響。而這道題邊的權值比較小,因此我們可以間一條邊權不為1的邊進行拆點,這樣就可以用上述方法處理。
#include#include#includeusing namespace std;
#define maxn 105
#define mod 2009
int f[maxn][maxn],g[maxn][maxn],ans[maxn][maxn],h[maxn][maxn];
int t,n;
char s[15][15];
void qpower(int n)
memset(h,0,sizeof h);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
for (int k=1;k<=n;k++)
h[i][j]=(h[i][j]+(f[i][k]*f[k][j])%mod)%mod;
memcpy(f,h,sizeof h); }}
int main()
{ scanf("%d%d",&n,&t);
for (int i=1;i<=8;i++)
for (int j=1;j<=n;j++) f[j+n*i][j+n*(i-1)]=1;
for (int i=1;i<=n;i++) scanf("%s",s[i]);
for (int i=1;i<=n;i++)
for (int j=0;j
BZOJ1297 迷路 矩陣的冪
傳送門 輸入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 ...
1297 SCOI2009 迷路 矩陣乘法
windy在有向圖中迷路了。該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在 t 時刻到達節點 n 1。現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎?注意 windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。第一行包含兩個整數,n t。接下來有 n 行...
BZOJ 2738 矩陣乘法
卡時卡的我心塞啊 因為插入操作太多而且沒有順序我們需要在sort後的插入操作上滾來滾去 其實並不需要排序opt陣列,而用int下標排序可避免複製的時間過長。include include include include include define maxn 510 using namespace ...