bfs用stl要mle
#include <bits/stdc++.h>
using namespace std;
int n,m;
int s;
bool pub[1000005];
int bank[1000005];
int h[1000005],ne[1000005],e[1000005],idx;
void add(int u,int v){
e[idx]=v,ne[idx]=h[u],h[u]=idx++;
}
//
int h2[1000005],ne2[1000005],e2[1000005],idx2;
inline void add2(int u,int v){
e2[idx2]=v,ne2[idx2]=h2[u],h2[u]=idx2++;
}
inline void readin(){
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;i++) cin>>bank[i];
int r;
cin>>s>>r;
for(int i=1;i<=r;i++){
int t;
cin>>t;
pub[t]=1;
}
}
//
int tc=0;
int cnt=0;
int c[1000005];
int mem[1000005];
int prc[1000005];
bool ins[1000005];
stack<int>st;
vector<int>vct[1000005];
int dfn[1000005],low[1000005];
inline void tarjan(int x){
//cout<<"at"<<x<<"\n";
dfn[x]=low[x]=++tc;
ins[x]=1,st.push(x);
for(int i=h[x];~i;i=ne[i]){
int y=e[i];
//cout<<"at"<<x<<'\n';
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}else if(ins[y]){
low[x]=min(low[x],dfn[y]);
}
}
//printf("over round 1 of %d\n",x);;
if(dfn[x]==low[x]){
cnt++;
int y;
vct[cnt].push_back(0);
do{
//cout<<1<<"of"<<x<<endl;
y=st.top(),st.pop();
ins[y]=0;
if(pub[y]) vct[cnt][0]=1;
c[y]=cnt;
mem[cnt]++;
prc[cnt]+=bank[y];
vct[cnt].push_back(y);
}while(x!=y);
}
}
int in[1000005];
int out[1000005];
inline void reuse(){
for(int i=1;i<=n;i++){
for(int j=h[i];~j;j=ne[j]){
int p=e[j];
if(c[i]==c[p]) continue;
if(c[i]==0||c[p]==0) continue;
add2(c[i],c[p]);
in[c[p]]++;
out[c[i]]++;
}
}
}
int ans=0;
int money[1000005];
int q[5000005];
int pi=0;
int po=1;
inline void bfs(int s){
money[s]=prc[s];
pi++;
q[pi]=s;
while(pi>=po){
int nowp=q[po];
po++;
if(vct[nowp][0]) ans=max(ans,money[nowp]);
for(int i=h2[nowp];~i;i=ne2[i]){
int nexp=e2[i];
money[nexp]=max(money[nexp],money[nowp]+prc[nexp]);
pi++;
q[pi]=nexp;
}
}
}
int main(){
ios::sync_with_stdio(false),
cin.tie(0),
cout.tie(0);
memset(h,-1,sizeof h);
memset(h2,-1,sizeof h2);
cin>>n>>m;
readin();
//puts("1");
tarjan(s);
//puts("2");
reuse();
/*
//puts("3");
puts("\n\ncnt+point\n");
for(int i=1;i<=cnt;i++){
cout<<i<<" :\t";
for(int j=1;j<=mem[i];j++){
cout<<vct[i][j]<<'\t';
}
puts("\nend");
}
puts("pubs");
for(int i=1;i<=cnt;i++) cout<<vct[i][0]<<'\t';
puts("\nroads");
for(int i=1;i<=cnt;i++){
for(int j=h2[i];~j;j=ne2[j]){
printf("%d\tto\t%d\n",i,e2[j]);
}
}
printf("s at %d\n",c[s]);
for(int i=1;i<=cnt;i++) cout<<prc[i]<<'\t';
puts("\nans : \n");
*/
bfs(c[s]);
cout<<ans;
return 0;
}