记录编号 |
521327 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[APIO2009] 抢掠计划 |
最终得分 |
100 |
用户昵称 |
Fisher. |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.046 s |
提交时间 |
2018-11-06 21:21:09 |
内存使用 |
25.11 MiB |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=500010;
int n,m;
int val[maxn];
vector<int>g[maxn];
vector<int>gg[maxn];
bool ok[maxn];
stack<int>zhan;
bool inzhan[maxn];
int tim,cnt,dfn[maxn],low[maxn],belong[maxn];
int money[maxn];
int st,p;
bool pok[maxn];
inline void tarjan(int u){//缩点
dfn[u]=low[u]=++tim;
zhan.push(u);inzhan[u]=true;
int len=g[u].size();
for(int i=0;i<len;i++){
int v=g[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(low[u]>dfn[v]&&inzhan[v])low[u]=dfn[v];
}
if(dfn[u]==low[u]){
cnt++;int v;
do{
v=zhan.top();zhan.pop();
inzhan[v]=false;
belong[v]=cnt;
}while(u!=v);
}
}
/*int d[maxn];
bool done[maxn];
struct dd{
int v,id;
inline bool operator <(const dd & a)const {
return v>a.v;
}
};
inline void dij(){
memset(d,127,sizeof(d));
d[belong[st]]=money[belong[st]];
//cout<<st<<endl;
priority_queue<dd>q;
q.push((dd){d[belong[st]],belong[st]});
while(q.size()){
dd tou=q.top();q.pop();
int u=tou.id;
if(done[u])continue;
done[u]=true;
int len=gg[u].size();
for(int j=0;j<len;j++){
int v=gg[u][j];
if(d[v]>d[u]+money[v]){
d[v]=d[u]+money[v];
q.push((dd){d[v],v});
}
}
}
}
*/
int d[maxn];
bool inq[maxn];
queue<int>q;
inline void spfa(){
d[belong[st]]=money[belong[st]];
q.push(belong[st]);
inq[belong[st]]=true;
while(q.size()){
int u=q.front();q.pop();
int len=gg[u].size();
for(int i=0;i<len;i++){
int v=gg[u][i];
if(d[v]<d[u]+money[v]){
d[v]=d[u]+money[v];
if(!inq[v]){
inq[v]=true;
q.push(v);
}
}
}
inq[u]=false;
}
}
int main(){
freopen("atm.in","r",stdin);
freopen("atm.out","w",stdout);
n=read();m=read();
for(int i=1;i<=m;i++){
int u=read(),v=read();
g[u].push_back(v);
}
for(int i=1;i<=n;i++){
val[i]=read();
}
//for(int i=1;i<=n;i++)cout<<i<<" "<<val[i]<<endl;
st=read();p=read();
for(int i=1;i<=p;i++){
int park=read();
ok[park]=true;
}
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=n;i++)if(ok[i])pok[belong[i]]=true;
for(int i=1;i<=n;i++)money[belong[i]]+=val[i];
//for(int i=1;i<=cnt;i++)cout<<i<<" "<<money[i]<<endl;
//for(int i=1;i<=n;i++)cout<<i<<" "<<belong[i]<<endl;
for(int i=1;i<=n;i++){
int len=g[i].size();
for(int j=0;j<len;j++){
int v=g[i][j];
if(belong[i]==belong[v])continue;
gg[belong[i]].push_back(belong[v]);
}
}
//dij();
spfa();
int ans=-0x7fffffff;
//for(int i=1;i<=cnt;i++)cout<<i<<" "<<d[i]<<endl;
for(int i=1;i<=cnt;i++){
if(pok[i])ans=max(ans,d[i]);
}
cout<<ans<<endl;
return 0;
}