清華月賽 大吉大利晚上喫雞題解

《大吉大利,晚上喫雞!》題解

出題人:陳宇

驗題人:刑健開(jkxing)

題目簡述

給定一張有邊權(邊權全爲正)的無向圖, n 個點 m 條邊,給定起點 S 和終點 T ,問有多少對 AB 滿足從 ST 的任意最短路一定經過 A 或者 B ,但是不存在某條最短路同時經過 AB

解法一

首先是最暴力的解法,枚舉任意點對 AB ,然後刪掉 AB ,看看最短距離是否會變長,然後查看 dis(S,A)+dis(A,B)+dis(B,T) 是否和 dis(S,T) 相等,其中 dis(X,Y) 表示原圖中點 XY 的最短距離,由此可以判斷枚舉的 AB 是否是合法的點對。

其中, dis(X,Y) 可以用floyd求解

時間複雜度: O(n3)

期望得分: 30

解法二

首先,雖然題目中給定的是無向圖,但是實際上我們可以先從 S 出發求一遍最短路,然後問題變成了:“在有向無環圖上,求有多少個滿足條件的點對 A,B ,滿足從 ST 的所有路徑一定經過 A,B 其中一點,並且不存在路徑同時經過 A,B ”。

求解這到題目的一個關鍵點在於: 滿足條件的點對 A,B 具有特點:從 SA 的方案數 ×AT 的方案數 + 從 SB 的方案數 ×BT 的方案數 =ST 的方案數。

所以在有向無環圖上用動態規劃求解路徑條數,再去掉 A 可以到達 BB 可以到達 A 的情況即可求解這到題目。

PS:方案數可能會爆掉怎麼辦?可以對方案數求餘一個大整數,如果覺得不夠的話可以求餘兩個大整數。

時間複雜度: O(n2+nm)

期望得分: 60

解法三

在解法二中,定義 F(X)=SX 的方案數 ×XT 的方案數 = 從 S 經過 X 到達 T 的方案數,所以滿足條件的點對 A,B 爲:

  1. F(A)+F(B)=F(T)
  2. AB 不能相互到達

對於條件 1 ,我們可以使用數據結構進行優化(使用std::map即可),而對於條件 2 ,我們可以使用 bitset 位壓 32 或者 64 位進行加速,使得最終時間和空間都能夠承受。

時間複雜度: O(nlog(n)+nm/32)

期望得分: 100

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章