hh有個一成不變的習慣,喜歡飯後百步走。所謂百步走,就是散步,就是在一定的時間 內,走過一定的距離。 但是同時hh又是個喜歡變化的人,所以他不會立刻沿著剛剛走來的路走回。 又因為hh是個喜歡變化的人,所以他每天走過的路徑都不完全一樣,他想知道他究竟有多 少種散步的方法。
現在給你學校的地圖(假設每條路的長度都是一樣的都是1),問長度為t,從給定地 點a走到給定地點b共有多少條符合條件的路徑
輸入格式:
第一行:五個整數n,m,t,a,b。其中n表示學校裡的路口的個數,m表示學校裡的 路的條數,t表示hh想要散步的距離,a表示散步的出發點,而b則表示散步的終點。
接下來m行,每行一組ai,bi,表示從路口ai到路口bi有一條路。資料保證ai != bi,但 不保證任意兩個路口之間至多只有一條路相連線。 路口編號從0到n − 1。 同一行內所有資料均由乙個空格隔開,行首行尾沒有多餘空格。沒有多餘空行。 答案模45989。
輸出格式:
一行,表示答案。
輸入樣例#1:
4 5 3 0 00 10 2
0 32 1
3 2
輸出樣例#1:
4
對於30%的資料,n ≤ 4,m ≤ 10,t ≤ 10。
對於100%的資料,n ≤ 50,m ≤ 60,t ≤ 2^30,0 ≤ a,b
#include#include#include
#include
using
namespace
std;
const
int mod=45989
;inline
intread()
return x*f;
}int n,m,t,a,b,tot=1
;int head[66
];struct
nodee[
200];
struct
mat a,b;
inline
void insert(int
from,int
to)inline mat matmul(mat a,mat b)
return
res;
}inline mat matpow(mat a,
intp)
intmain()
int cnt=0
;
for(int i=head[a];i;i=e[i].next) ++a.m[1
][i];
for(int i=2;i<=tot;++i)
for(int j=2;j<=tot;++j)
if(e[i].to==e[j].from
)
if(i!=(j^1)) ++b.m[i][j];
a=matmul(a,matpow(b,t-1
));
for(int i=head[b];i;i=e[i].next)
cnt+=a.m[1][i^1
]; printf(
"%d\n
",cnt%mod);
return0;
}
洛谷 P2151 SDOI2009 HH去散步
題目鏈結 思路如果沒有不能走上一條邊的限制,很顯然就是dp。設f i j 表示到達i點走了j步的方案數,移到k點可以表示為f k j 1 f i j 如果有限制的話,可以考慮用邊表示將之前思路中的i變為邊的終點,只要不走同一條邊,轉移還是相同的。但是t 2 30,顯然直接dp是不可行的,這是機智的題...
洛谷 P2153 SDOI2009 晨跑
給出一幅有向無環圖,問從點1到點n有幾條互相沒有交點 除起點終點外不能有公共點 的路徑,保證路徑數量最多的情況下,路徑最大數量與最短的路徑長度之和是多少.與費用流裸題不同的是,不能有公共點,解決方法是將每乙個點拆為乙個入點和乙個出點,流量為1 起點終點不用拆或者流量為inf 建邊時,從乙個點的出點連...
洛谷P2153 SDOI2009 晨跑
elaxia最近迷戀上了空手道,他為自己設定了一套健身計畫,比如俯臥撐 仰臥起坐等 等,不過到目前為止,他堅持下來的只有晨跑。現在給出一張學校附近的地圖,這張地圖中包含n個十字路口和m條街道,elaxia只能從 乙個十字路口跑向另外乙個十字路口,街道之間只在十字路口處相交。elaxia每天從寢室出發...