【BZOJ1179】[Apio2009]Atm/搶掠計劃

1179: [Apio2009]Atm

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit: 4701  Solved: 2087
[Submit][Status][Discuss]

Description

Siruseri 城中的道路都是單向的。不一樣的道路由路口鏈接。按照法律的規定, 在每一個路口都設立了一個 Siruser
i 銀行的 ATM 取款機。使人奇怪的是,Siruseri 的酒吧也都設在路口,雖然並非每一個路口都設有酒吧。Bandit
ji 計劃實施 Siruseri 有史以來最驚天動地的 ATM 搶劫。他將從市中心 出發,沿着單向道路行駛,搶劫全部他
途徑的 ATM 機,最終他將在一個酒吧慶 祝他的勝利。使用高超的黑客技術,他獲知了每一個 ATM 機中能夠掠取的
現金數額。他希 望你幫助他計算從市中心出發最後到達某個酒吧時最多能搶劫的現金總數。他可 以通過同一路口
或道路任意屢次。但只要他搶劫過某個 ATM 機後,該 ATM 機 裏面就不會再有錢了。 例如,假設該城中有 6 個
路口,道路的鏈接狀況以下圖所示:
市中心在路口 1,由一個入口符號→來標識,那些有酒吧的路口用雙圈來表示。每一個 ATM 機中可取的錢數標在了
路口的上方。在這個例子中,Banditji 能搶 劫的現金總數爲 47,實施的搶劫路線是:1-2-4-1-2-3-5。

Input

第一行包含兩個整數N、M。N表示路口的個數,M表示道路條數。
接下來M行,每行兩個整數,這兩個整數都在1到N之間,
第i+1行的兩個整數表示第i條道路的起點和終點的路口編號。
接下來N行,每行一個整數,按順序表示每一個路口處的ATM機中的錢數。
接下來一行包含兩個整數S、P,S表示市中心的編號,也就是出發的路口。P表示酒吧數目。
接下來的一行中有P個整數,表示P個有酒吧的路口的編號
N, M<=500000。每一個ATM機中可取的錢數爲一個非負整數且不超過4000。
輸入數據保證你能夠從市中心沿着Siruseri的單向的道路到達其中的至少一個酒吧。

Output

輸出一個整數,表示Banditji從市中心開始到某個酒吧結束所能搶劫的最多的現金總數。php

Sample Input

6 7
1 2
2 3
3 5
2 4
4 1
2 6
6 5
10
12
8
16
1 5
1 4
4
3
5
6

Sample Output

47

HINT

 

Source

 
[ Submit][ Status][ Discuss]


HOME Back算法

 

Solution:數組

這題其實蠻有意思的,正好複習tarjan算法了。spa

tarjan算法流程:blog

dfn數組記錄第一次dfs的時間,low數組記錄搜索回棧內最先元素的dfn值。排序

因而有$low[u]=min(low[v],dfn[v],dfn[u])$ip

話說回來,low不同的節點也能夠在同一個聯通塊內,這點我須要翻算法導論。路由

回到這個題目,對於這個題目,咱們不難發現若是他走環至關於走了一個點,因而咱們就把這些點縮成scc,重構圖,而後跑一遍spfa求出每一個有酒吧的scc裏的最大值(最長路),以後判一遍。get

時間複雜度:$O(n+n+m)$,由於這裏縮完點以後至關因而拓撲排序了(由於圖變成了DAG)。it

不過話說回來我拓撲排序還沒複習……

相關文章
相關標籤/搜索