P3627 APIO2009 搶掠計畫

2021-08-09 09:17:18 字數 2400 閱讀 7629

題目描述

siruseri 城中的道路都是單向的。不同的道路由路口連線。按照法律的規定, 在每個路口都設立了乙個 siruseri 銀行的 atm 取款機。令人奇怪的是,siruseri 的酒吧也都設在路口,雖然並不是每個路口都設有酒吧。

banditji 計畫實施 siruseri 有史以來最驚天動地的 atm 搶劫。他將從市中心 出發,沿著單向道路行駛,搶劫所有他途徑的 atm 機,最終他將在乙個酒吧慶 祝他的勝利。

使用高超的黑客技術,他獲知了每個 atm 機中可以掠取的現金數額。他希 望你幫助他計算從市中心出發最後到達某個酒吧時最多能搶劫的現金總數。他可 以經過同一路口或道路任意多次。但只要他搶劫過某個 atm 機後,該 atm 機 裡面就不會再有錢了。 例如,假設該城中有 6 個路口,道路的連線情況如下圖所示:

市中心在路口 1,由乙個入口符號→來標識,那些有酒吧的路口用雙圈來表

示。每個 atm 機中可取的錢數標在了路口的上方。在這個例子中,banditji 能搶 劫的現金總數為 47,實施的搶劫路線是:1-2-4-1-2-3-5。

輸入輸出格式

輸入格式:

第一行包含兩個整數 n、m。n 表示路口的個數,m 表示道路條數。接下來 m 行,每行兩個整數,這兩個整數都在 1 到 n 之間,第 i+1 行的兩個整數表示第 i 條道路的起點和終點的路口編號。接下來 n 行,每行乙個整數,按順序表示每 個路口處的 atm 機中的錢數。接下來一行包含兩個整數 s、p,s 表示市中心的 編號,也就是出發的路口。p 表示酒吧數目。接下來的一行中有 p 個整數,表示 p 個有酒吧的路口的編號。

輸出格式

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

輸入輸出樣例

輸入

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

輸出

47說明

50%的輸入保證 n, m<=3000。所有的輸入保證 n, m<=500000。每個 atm 機中可取的錢數為乙個非負整數且不超過 4000。

輸入資料保證你可以從市中心 沿著 siruseri 的單向的道路到達其中的至少乙個酒吧。

一題很容易想到但不容易實現的tarjan+spfa(我除錯了三個多小時……)

注意tarjan裡的to一定不要開全域性變數。。。會t(親身體驗qaq)

**:

#include

#include

using namespace std;

int n,m,dep=0,num=0,cnt,n2,m2,jiu,top=0,ans=0,dis[500086],bel[500010],val[500086];

int s[500086],he[500086],dfn[500086],low[500086],x[500086],y[500086],z[500086];

bool ex[500086];

struct stare[500086];

void add(int from,int

to)void tarjan(int x)

else

if(ex[to])

low[x]=min(low[x],dfn[to]);

}if(dfn[x]==low[x])while(x!=to);

}}void spfa(int s)}}

}while(q.size());

}int main()

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

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

if(!dfn[i])

tarjan(i);

num=0;

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

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

if(bel[x[i]]!=bel[y[i]])

add(bel[x[i]],bel[y[i]]);

scanf("%d%d",&n2,&m2);

spfa(bel[n2]);

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

printf("%d",ans);

return 0;

}

P3627 APIO2009 搶掠計畫

p3627 apio2009 搶掠計畫 tarjan縮點 最短 最長 路 顯然的縮點.在縮點時,順便維護每個強連通分量的總權值 縮完點按照慣例建個新圖 然後跑一遍spfa最長路,列舉每個有酒吧的點即可 但是我為什麼會搞dp呢.dp 81pts 這麼顯然的最長路,為什麼會搞dp呢.怕不是被dp題毒害了...

P3627 APIO2009 搶掠計畫

傳送門 演算法 tarjan dp 顯然縮點後的圖是乙個dag dag上搞dp是基本操作啊 按拓撲序搞一波dp就好了 設 f i 表示從起點搶劫到 dag 上的點 i 時能得到的最多的錢 那麼 f i max f i f j sval i j 有一條邊指向 i sval i 表示dag上點 i 的錢...

洛谷P3627 APIO2009 搶掠計畫

題目大意 給你一張 n n leqslant5 times10 5 個點 m m leqslant5 times10 5 條邊的有向圖,有點權,給你起點和一些可能的終點。問從起點開始,到任意乙個終點經過的點權和的最大值是多少。題解 先把有向圖縮點,然後從起點跑最長路,對每個終點取個最大值即可 卡點 ...