APIO2009 3 搶掠計畫

2021-08-15 07:20:52 字數 1691 閱讀 9464

描述

siruseri 城中的道路都是單向的。不同的道路由路口連線。按照法律的規定,在每個路口都設立了乙個 siruseri 銀行的 atm 取款機。 令人奇怪的是, siruseri 的酒吧也都設在路口,雖然並不是每個路口都設有酒吧。banditji 計畫實施 siruseri 有史以來最驚天動地的 atm 搶劫。他將從市中心出發,沿著單向道路行駛,搶劫所有他途徑的 atm 機,最終他將在乙個酒吧慶祝他的勝利。使用高超的黑客技術,他獲知了每個 atm 機中可以掠取的現金數額。他希 望你幫助他計算從市中心出發最後到達某個酒吧時最多能搶劫的現金總數。他可以經過同一路口或道路任意多次。但只要他搶劫過某個 atm 機後, 該 atm 機裡面就不會再有錢了。例如,假設該城中有 6 個路口,道路的連線情況如下圖所示:

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

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

就是tarjan縮點後跑spfa

我可能自帶大常數吧。。反正不用讀優t了

#includeusing namespace std;

#define n 500000

#define m 500000

#define inf 0x3f3f3f3f

int dfn[n],low[n],vis[n],first[n],color[n],siz[n];

int w[n],jg[n],atm[n];

int head[n],visit[n],dis[n];

int cnt=0,cot=0,tot=0,num=0,n,m,ss,p,ans=0;

stack s;

queue q;

struct email

e[m*2],edge[m*2];

inline void read(int &x)

while(c>='0'&&c<='9')

x*=f;

}inline void add(int u,int v)

inline void readd(int u,int v,int w)

void tarjan(int u)

else

if(vis[v])

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

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

}void spfa(int start)

} }}void readin()

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

read(w[i]);

read(ss);read(p);

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

read(jg[i]);

}int main()

spfa(color[ss]);

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

ans=max(ans,-dis[color[jg[i]]]);

printf("%d",ans);

}

APIO2009 搶掠計畫

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

APIO2009 搶掠計畫

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

P3627 APIO2009 搶掠計畫

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