RT。 WA on #3 #11。
代码如下:
#include <iostream>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;
#define N 1000010
#define int long long
struct edge {
int v, ne;
} a[N];
struct edgeedge {
int to, ne;
} e[N];
queue <int> q;
stack <int> s;
int n, m, idx, indx, cl, tme, cen, p;
int low[N], dfn[N], val[N], vl[N], deg[N], col[N], hd[N], head[N], dis[N];
bool insta[N], ok[N], okk[N], vis[N];
void add(int u, int v) {
a[ ++ idx].v = v; a[idx].ne = hd[u]; hd[u] = idx;
}
void pls(int u, int v) {
e[ ++ indx].to = v; e[indx].ne = head[u]; head[u] = indx;
}
void tarjan(int u) {
low[u] = dfn[u] = ++ tme;
insta[u] = true; s.push(u);
for(int i = hd[u]; i; i = a[i].ne) {
int v = a[i].v;
if( ! dfn[v]) {
tarjan(v);
low[u] = std::min(low[u], low[v]);
}
else if(insta[v]) low[u] = std::min(low[u], dfn[v]);
}
if(low[u] == dfn[u]) {
cl ++;
while(s.top() != u) {
int v = s.top(); s.pop();
col[v] = cl; vl[cl] += val[v];
insta[v] = false;
if(ok[v]) okk[cl] = true;
}
s.pop(); col[u] = cl;
vl[cl] += val[u];
insta[u] = false;
if(ok[u]) okk[cl] = true;
}
}
void build() {
for(int i = 1; i <= n; i ++) {
for(int j = hd[i]; j; j = a[j].ne) {
int u = col[i], v = col[a[j].v];
if(u == v) continue;
deg[v] ++;
pls(u, v);
}
}
}
int topo(int fr) {
for(int i = 1; i <= cl; i ++) dis[i] = vl[i];
q.push(col[fr]);
while( ! q.empty()) {
int u = q.front(); q.pop();
for(int i = head[u]; i; i = e[i].ne) {
int v = e[i].to;
dis[v] = std::max(dis[u] + vl[v], dis[v]);
deg[v] --;
if(deg[v] == 0) q.push(v);
}
}
int ans = 0;
for(int i = 1; i <= cl; i ++) {
if(okk[i]) ans = std::max(ans, dis[i]);
}
return ans;
}
signed main() {
//freopen("P3627_3.in", "r", stdin);
ios::sync_with_stdio(false);
cin >> n >> m;
while(m --) {
int x, y; cin >> x >> y;
add(x, y);
}
for(int i = 1; i <= n; i ++) cin >> val[i];
cin >> cen >> p;
while(p --) {
int x; cin >> x; ok[x] = 1;
}
tarjan(cen);
build();
cout << topo(cen);
return 0;
}