洛谷 P2151 SDOI2009 HH去散步

2022-08-04 20:30:14 字數 1270 閱讀 6268

題目鏈結

思路如果沒有不能走上一條邊的限制,很顯然就是dp。

設f[i][j]表示到達i點走了j步的方案數,移到k點可以表示為f[k][j+1]+=f[i][j]。

如果有限制的話,可以考慮用邊表示將之前思路中的i變為邊的終點,只要不走同一條邊,轉移還是相同的。

但是t ≤ 2^30,顯然直接dp是不可行的,這是機智的題解就想到了矩陣優化。

由於遞推關係是線性的,可以搞乙個行矩陣表示對於當前移動步數各個邊的方案數。

轉移可以考慮構造另乙個矩陣,所有可以更新的邊之間都變為1,其他是0,對於每一次轉移都是一樣的,所以只要將矩陣跑t次就可以了。

對於初始矩陣,可以加一條邊設乙個不存在的點,將它與起點相連,也方便之後的領接表。

此題瘋狂卡時,辣雞出題人。(據說多交幾次就可以過

1 #include2 #include3 #include4

using

namespace

std;

5const

int mod=45989;6

int n,m,t,e,s,cnt,hd[125

],sum;

7struct

edge

8v[125

];11

struct

mat12

18 mat operator *(mat x)

1927

}c,ans;

28void addedge(int x,int

y)29

35 mat mul(mat x,int

k)36

45int

main()

4657

for(int i=1;i<=cnt;i++)

58for(int j=1;j<=cnt;j++)

59if((i^j)!=1&&v[i].to==v[j].from

)60 c.a[i][j]=1

;61 ans.a[1][1]=1

;62 c=mul(c,t);

63 ans=ans*c;

64for(int i=1;i<=cnt;i++)

65if(v[i].to==e)

66 sum=(sum+ans.a[1][i])%mod;

67 printf("

%d\n

",sum);

68return0;

69 }

view code

洛谷P2151 SDOI2009 HH去散步

hh有個一成不變的習慣,喜歡飯後百步走。所謂百步走,就是散步,就是在一定的時間 內,走過一定的距離。但是同時hh又是個喜歡變化的人,所以他不會立刻沿著剛剛走來的路走回。又因為hh是個喜歡變化的人,所以他每天走過的路徑都不完全一樣,他想知道他究竟有多 少種散步的方法。現在給你學校的地圖 假設每條路的長...

洛谷 P2153 SDOI2009 晨跑

給出一幅有向無環圖,問從點1到點n有幾條互相沒有交點 除起點終點外不能有公共點 的路徑,保證路徑數量最多的情況下,路徑最大數量與最短的路徑長度之和是多少.與費用流裸題不同的是,不能有公共點,解決方法是將每乙個點拆為乙個入點和乙個出點,流量為1 起點終點不用拆或者流量為inf 建邊時,從乙個點的出點連...

洛谷P2153 SDOI2009 晨跑

elaxia最近迷戀上了空手道,他為自己設定了一套健身計畫,比如俯臥撐 仰臥起坐等 等,不過到目前為止,他堅持下來的只有晨跑。現在給出一張學校附近的地圖,這張地圖中包含n個十字路口和m條街道,elaxia只能從 乙個十字路口跑向另外乙個十字路口,街道之間只在十字路口處相交。elaxia每天從寢室出發...