洛谷P2151 SDOI2009 HH去散步

2022-03-01 06:43:18 字數 1675 閱讀 9625

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 0

0 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每天從寢室出發...