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