RT. T了第三个点
貌似没有题解详细提到
代码:
#include <bits/stdc++.h>
#define INF 0x3fffffff
#define INFF 1e18
#define endl '\n'
#define lson id << 1
#define rson id << 1 | 1
using namespace std;
const int N = 5e5 + 5;
int hd[N], cnt;
int w[N], x[N << 1], y[N << 1];
bool vis[N], can[N];
int low[N], dfn[N], times, st[N], top, tot, color[N], sum[N], num[N];
int n, m, s, p, S;
struct Edge {
int to, nx;
} e[N << 1];
void add(int u, int v) {
e[ ++ cnt] = {v, hd[u]}, hd[u] = cnt;
}
void tarjan(int u) {
low[u] = dfn[u] = ++ times;
st[ ++ top] = u;
for (int i = hd[u]; i; i = e[i].nx) {
int v = e[i].to;
if (!dfn[v]) {
tarjan(v), low[u] = min(low[u], low[v]);
} else if (!color[v]) {
low[u] = min(low[u], dfn[v]);
}
}
if (low[u] == dfn[u]) {
tot ++;
while (1) {
int v = st[top --];
color[v] = tot, sum[tot] += w[v];
if (vis[v]) can[tot] = 1;
if (v == s) S = tot;
if (v == u) break;
}
}
}
void dfs(int u, int fa) {
if (num[fa] + sum[u] <= num[u]) return;
num[u] = max(num[u], num[fa] + sum[u]);
for (int i = hd[u]; i; i = e[i].nx) {
int v = e[i].to;
dfs(v, u);
}
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= m; i ++) {
cin >> x[i] >> y[i];
add(x[i], y[i]);
}
for (int i = 1; i <= n; i ++) cin >> w[i];
cin >> s >> p;
for (int i = 1; i <= p; i ++) {
int x;
cin >> x;
vis[x] = 1;
}
for (int i = 1; i <= n; i ++)
if (!dfn[i]) top = 0, tarjan(i);
memset(hd, 0, sizeof hd);
memset(e, 0, sizeof e);
cnt = 0;
for (int i = 1; i <= m; i ++) {
int u = color[x[i]], v = color[y[i]];
if (u != v) add(u, v);
}
dfs(S, S);
int ans = 0;
for (int i = 1; i <= tot; i ++) {
if (!can[i]) continue;
ans = max(ans, num[i]);
}
cout << ans;
return 0;
}