這道題碼的十分痛苦。
題目鏈結
思路: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 有史以來最驚天動地...