APIO2009 搶掠計畫

2022-05-07 19:24:06 字數 2626 閱讀 2579

description

siruseri城中的道路都是單向的。不同的道路由路口連線。按照法律的規定,在每個路口都設立了乙個siruseri銀行的atm取款機。令人奇怪的是,siruseri的酒吧也都設在路口,雖然並不是每個路口都設有酒吧。 banditji計畫實施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個有酒吧的路口的編號。

output

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

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

50%的輸入保證n, m<=3000。

所有的輸入保證n, m<=500000。

每個atm機中可取的錢數為乙個非負整數且不超過4000。

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

本蒟蒻第一眼看到這個題表示被嚇到了,apio的題目!!!肯定巨難。。。

細讀題目你會發現這其實是一道tarjan縮點,跑最長路的大水題!!!

把環縮成點強行重新建圖(變成了dag),直接暴力spfa就出來了

空間,常數巨大的**:

# include 

# include

# include

# include

# include

# include

using

namespace

std;

# define n 2000001

# define il inline

# define rg register

# define un unsigned

# define ll long long

# define oo 2147483647

# define mem(a, b) memset(a, b, sizeof(a))

# define max(a, b) ((a) > (b)) ? (a) : (b)

# define min(a, b) ((a) < (b)) ? (a) : (b)

il int get()

int n, m, ft[n], nt[n], to[n], bg[n], sk[n], isk[n], dfn[n], low[n], cnt, w[n];

int dis[n], ans, num, cnt1, in[n];

queue

q;il void add(rg int u, rg int v)

il void dfs(rg int u)

else

if(isk[v]) low[u] = min(low[u], dfn[v]);

}if(dfn[u] == low[u])

}}il void spfa(rg int s)

}in[u] = 0;

}}int main()

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

w[i] = get();

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

if(!dfn[i]) dfs(i);

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

for(rg int e = ft[i]; e != -1; e = nt[e])

spfa(get());

rg int t = get();

while(t--)

printf("%d\n", ans);

return

0;}

顯然我的**又臭又長,請大佬自行優

APIO2009 搶掠計畫

嘟嘟嘟 這題讀完思路應該馬上就有了。先強連通分量縮點,然後在dag上dp求最長路即可,並且只在有酒吧的點更新答案。但是這樣不一定正確。原因就是拓撲排序是每一次把入度為0的點加入佇列,但對於每乙個點的入度,我們重新建圖的時候也算上了和起點不連通的點的貢獻,導致入度變大,進而導致有些點無法dp到,使答案...

APIO2009 搶掠計畫 解題報告

這道題碼的十分痛苦。題目鏈結 思路 tarjan縮點,重新建圖,點權轉邊權,邊權變為負值,跑一遍spfa求最長路即可。思路很簡單,但是碼量有點痛苦,打了一百行,打兩個板子就發現了許多問題,例如 程式出錯的時候不知道是 出了問題,找錯十分麻煩。我自己出現的錯誤還是挺多的,模板不是很熟悉。include...

P3627 APIO2009 搶掠計畫

題目描述 siruseri 城中的道路都是單向的。不同的道路由路口連線。按照法律的規定,在每個路口都設立了乙個 siruseri 銀行的 atm 取款機。令人奇怪的是,siruseri 的酒吧也都設在路口,雖然並不是每個路口都設有酒吧。banditji 計畫實施 siruseri 有史以來最驚天動地...