題解 P4159 SCOI2009 迷路

2022-05-22 16:33:12 字數 1094 閱讀 7119

\(\large}\)

題目和普通的 \(01\) 路徑矩陣加速有一點區別,做法很巧。

\(\large}\)

給定乙個鄰接矩陣,即每個點之間的邊權,若為 \(0\) 則無邊,因為是 \(a*a\) 的矩陣,所以隱藏含義是每條邊權 \(1\)~\(9\) 。

\(\large}\)

因為邊權不只是 \(1\) 了,所以不能直接就將每個點連線邊做矩乘,但是資料範圍太大又不能不用矩乘。

注意到邊權為 \(1\)~\(9\) ,所以可以將每乙個點拆成 \(9\) 個點,若原先每個點為 \(i\) ,則拆後的點為 \((i-1)*9+n~(1\le n\le9)\), \(i\) 的主點為 \((i-1)*9+1\) ,並將點 \((i-1)*9+n\) 和 \((i-1)*9+n+1\) 連邊長為 \(1\) 。

然後連長度不為 \(1\) 的邊就很方便了,若連點 \(u\) 和 \(v\) 邊權為 \(k\) ,則連線 \((u-1)*9+k\) 和 \((v-1)*9+1\) ,這樣,從 \(u\) 的主點必須要走 \(k-1\) 個單位,再走這條邊才到的主點,且可以使用矩陣乘法+快速冪。

最後答案即為 \(1\) 的主點到 \(n\) 的主點的距離。

\(\large}\)

#includeusing namespace std;

// #define int long long

const int mod=2009;

const int n=10;

int a,b;

char ch;

struct node

inline void re()

inline void print() }

node operator*(const node b)

return sum;

}} s,a;

inline void pow(int n)

}signed main()

}a=s;

pow(b-1);

printf("%d",s.s[1][(a-1)*9+1]);

return 0;

}

\(\large}\)

洛谷 P4159 SCOI2009 迷路

如果邊權為 1 11,則是簡單的矩陣快速冪加速dp遞推方程,又因為邊權並不大,所以考慮拆點,新圖中邊權均為 1 11,將每個點暴力拆成相連的 9 99 個點,對於原先某條邊 u,v,w u,v,w u,v,w 可以轉化為 u uu 拆成的點中第 w ww 個連向 v vv 拆成的點中第 1 11 個...

洛谷 P4159 SCOI2009 迷路

windy在有向圖中迷路了。該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在 t 時刻到達節點 n 1。現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎?注意 windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。根據題意,可以寫出轉移方程 f sum f ...

洛谷 4159 SCOI2009 迷路

題目描述 windy在有向圖中迷路了。該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在 t 時刻到達節點 n 1。現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎?注意 windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。輸入格式 第一行包含兩個整數,n ...