Tarjan + spfa,但跟题解区的这个思路相同的代码比较后,感觉差不多 Link
My code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
vector<int>g[N];
vector<int>ne[N],nw[N];
int cnt,idx,n,m,s,p;
int dfn[N],low[N],scc[N],a[N],b[N],dis[N],jzh[N],in[N];
bool vis[N];
bool fw[N];
stack<int>t;
void dfs(int x){
dfn[x]=++cnt;
low[x]=dfn[x];
t.push(x);vis[x]=1;
for(auto v:g[x]){
if(!dfn[v]) dfs(v),low[x]=min(low[x],low[v]);
else if(vis[v]) low[x]=min(low[x],dfn[v]);
}
if(low[x]==dfn[x]){
++idx;
while(1){
auto ts=t.top();t.pop();
vis[ts]=0;
scc[ts]=idx;
jzh[idx]+=a[ts];
if(ts==x)break;
}
}
}
void spfa(){
memset(dis,-0x3f,sizeof(dis));
queue<int>q;
vis[scc[s]]=1,dis[scc[s]]=0;
q.push(scc[s]);
while(q.size()){
auto u=q.front();q.pop();
vis[u]=0;
for(int i=0;i<ne[u].size();i++){
int v=ne[u][i],w=nw[u][i];
if(dis[v]<dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v])q.push(v),vis[v]=1;
}
}
}
int sum=0;
for(int i=1;i<=p;i++)sum=max(sum,dis[scc[b[i]]]+idx);
cout<<sum;
}
signed main(){
cin>>n>>m;
while(m--){
int u,v;
cin>>u>>v;
g[u].push_back(v);
}
for(int i=1;i<=n;i++)cin>>a[i];
cin>>s>>p;
for(int i=1;i<=p;i++)cin>>b[i];
for(int i=1;i<=n;i++)if(!dfn[i])dfs(i);
for(int i=1;i<=n;i++){
for(int v:g[i]){
if(scc[i]!=scc[v]){
ne[scc[i]+idx].push_back(scc[v]),in[scc[v]]++;
nw[scc[i]+idx].push_back(0);
}
}
}
for(int i=1;i<=idx;i++){
ne[i].push_back(i+idx);
nw[i].push_back(jzh[i]);
}
spfa();
return 0;
}