求助

P3627 [APIO2009] 抢掠计划

sorry更正一下代码 ``` // luogu-judger-enable-o2 #include <cstdio> #include <iostream> #include <cctype> #include <vector> #include <stack> using namespace std; int n, m; int a[500002], A[500002]; int dfn[500002], low[500002], color[500002], ins[500002], cnt, clr; vector <int> V[500002], E[500002]; stack <int> s; void tarjan(int x) { dfn[x] = low[x] = ++cnt; ins[x] = 1; s.push(x); for(int i = 0; i < V[x].size(); i++) { if(!dfn[V[x][i]]) { tarjan(V[x][i]); low[x] = min(low[x], low[V[x][i]]); } else if(ins[V[x][i]]) { low[x] = min(low[x], dfn[V[x][i]]); } } if(low[x] == dfn[x]) { color[x] = ++clr; A[clr] += a[x]; ins[x] = 0; while(s.top() != x) { color[s.top()] = clr; A[clr] += a[s.top()]; ins[s.top()] = 0; s.pop(); } s.pop(); } } long long dfs(int x) { long long ans = 0; for(int i = 0; i < E[x].size(); i++) ans = max(ans, dfs(E[x][i])); return ans + A[x]; } int main(int argc, char **argv) { freopen("in.txt", "r", stdin); int i, j, S, P; scanf("%d%d", &n, &m); for(i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); V[u].push_back(v); } for(i = 1; i <= n; i++) scanf("%d", &a[i]); scanf("%d%d", &S, &P); for(i = 1; i <= P; i++) { int tmp; scanf("%d", &tmp); V[tmp].push_back(n + 1); } for(i = 1; i <= n + 1; i++) if(!dfn[i]) tarjan(i); A[color[n + 1]] = 2000000001; for(i = 1; i <= n; i++) for(j = 0; j < V[i].size(); j++) if(color[i] != color[V[i][j]]) E[color[i]].push_back(color[V[i][j]]); printf("%lld\n", dfs(color[S]) - A[color[n + 1]]); return 0; } ```
by 斯茂 @ 2019-02-11 21:24:17


建议私信cz
by chenlingxi @ 2019-02-11 21:25:33


楼上魔鬼(滑稽
by Zyque @ 2019-02-11 21:28:49


|