记录编号 521327 评测结果 AAAAAAAAAA
题目名称 [APIO2009] 抢掠计划 最终得分 100
用户昵称 GravatarFisher. 是否通过 通过
代码语言 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;
}