APIO2009 搶掠計畫

2022-05-09 12:48:11 字數 2140 閱讀 2461

嘟嘟嘟

這題讀完思路應該馬上就有了。

先強連通分量縮點,然後在dag上dp求最長路即可,並且只在有酒吧的點更新答案。

但是這樣不一定正確。原因就是拓撲排序是每一次把入度為0的點加入佇列,但對於每乙個點的入度,我們重新建圖的時候也算上了和起點不連通的點的貢獻,導致入度變大,進而導致有些點無法dp到,使答案變小。

所以可以只從起點跑一邊tarjan,並且標記能跑到的點。然後重建圖的時候特判即可。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define enter puts("")

13#define space putchar(' ')

14#define mem(a, x) memset(a, x, sizeof(a))

15#define rg register

16 typedef long

long

ll;17 typedef double

db;18

const

int inf = 0x3f3f3f3f;19

const db eps = 1e-8;20

const

int maxn = 5e5 + 5;21

inline ll read()

2230 inline void

write(ll x)

3136

37int

n, m, s, p, a[maxn];

38bool

bar[maxn];

39struct

edge

40e[maxn];

43int head[maxn], ecnt = -1;44

void addedge(int x, int

y)45

;47 head[x] =ecnt;48}

4950

int dfn[maxn], low[maxn], cnt = 0;51

int st[maxn], top = 0;52

bool

in[maxn], bel[maxn], vis[maxn];

53int col[maxn], ccol = 0;54

ll val[maxn];

55void tarjan(int

now)

5667

else

if(in[v]) low[now] =min(low[now], dfn[v]);68}

69if(dfn[now] ==low[now])

70while(x !=now);81}

82}8384

edge e2[maxn];

85int head2[maxn], ecnt2 = -1;86

intdu[maxn];

87void addedge2(int x, int

y)88

;90 head2[x] =ecnt2;91}

92void newgraph(int

now)

93101

}102

103 ll dp[maxn], ans = 0

;104

void topo(int

s)105

119}

120}

121122

intmain()

123131

for(int i = 1; i <= n; ++i) a[i] =read();

132 s = read(); p =read();

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

134tarjan(s);

135 mem(head2, -1

);136

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

137topo(col[s]);

138write(ans), enter;

139return0;

140 }

view code

APIO2009 搶掠計畫

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

APIO2009 搶掠計畫 解題報告

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

P3627 APIO2009 搶掠計畫

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