APIO2009 搶掠計畫 解題報告

2022-05-15 07:42:11 字數 1372 閱讀 4088

這道題碼的十分痛苦。

題目鏈結

思路:tarjan縮點,重新建圖,點權轉邊權,邊權變為負值,跑一遍spfa求最長路即可。

思路很簡單,但是碼量有點痛苦,打了一百行,打兩個板子就發現了許多問題,例如:程式出錯的時候不知道是**出了問題,找錯十分麻煩。我自己出現的錯誤還是挺多的,模板不是很熟悉。

**:

#include#include

#include

#include

#include

using

namespace

std;

const

int n=500009

;struct

edgee[n],e[n];

intn,m,num,num,s,p,co,top,cnt,l,r;

int head[n],far[n],head[n],ans=0x3f3f3f3f,q[3*n],atm[n],flag[n],pd[n],val[n],stk[n],low[n],dfn[n],col[n],vis[n];

void add(int u,int

v)void add(int u,int v,int

w)void tarjan(int

u)

else

if(vis[v])

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

top--;

}}void

spfa()}}

}}int

main()

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

scanf("%d

",&atm[i]);

scanf(

"%d%d

",&s,&p);

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

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

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

for(register int u=1;u<=n;u++)

for(int i=head[u];i;i=e[i].next)

spfa();

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

if(flag[i]&&ans>far[col[i]])

ans=far[col[i]];

printf("%d

",-ans);

return0;

}

以前只做過 tarjan+樹型dp的,這道題是tarjan + spfa 的。

APIO2009 搶掠計畫

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

APIO2009 搶掠計畫

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

P3627 APIO2009 搶掠計畫

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