題目鏈結
思路如果沒有不能走上一條邊的限制,很顯然就是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 #include4view codeusing
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 }
洛谷P2151 SDOI2009 HH去散步
hh有個一成不變的習慣,喜歡飯後百步走。所謂百步走,就是散步,就是在一定的時間 內,走過一定的距離。但是同時hh又是個喜歡變化的人,所以他不會立刻沿著剛剛走來的路走回。又因為hh是個喜歡變化的人,所以他每天走過的路徑都不完全一樣,他想知道他究竟有多 少種散步的方法。現在給你學校的地圖 假設每條路的長...
洛谷 P2153 SDOI2009 晨跑
給出一幅有向無環圖,問從點1到點n有幾條互相沒有交點 除起點終點外不能有公共點 的路徑,保證路徑數量最多的情況下,路徑最大數量與最短的路徑長度之和是多少.與費用流裸題不同的是,不能有公共點,解決方法是將每乙個點拆為乙個入點和乙個出點,流量為1 起點終點不用拆或者流量為inf 建邊時,從乙個點的出點連...
洛谷P2153 SDOI2009 晨跑
elaxia最近迷戀上了空手道,他為自己設定了一套健身計畫,比如俯臥撐 仰臥起坐等 等,不過到目前為止,他堅持下來的只有晨跑。現在給出一張學校附近的地圖,這張地圖中包含n個十字路口和m條街道,elaxia只能從 乙個十字路口跑向另外乙個十字路口,街道之間只在十字路口處相交。elaxia每天從寢室出發...