记录编号 302935 评测结果 AAAAAAAAAA
题目名称 [APIO2009] 抢掠计划 最终得分 100
用户昵称 GravatarNewBee 是否通过 通过
代码语言 C++ 运行时间 0.023 s
提交时间 2016-09-04 18:59:19 内存使用 32.45 MiB
显示代码纯文本
#include<cstdio>
#include<queue>
#include<cstring>
#define Cu fclose(stdin);fclose(stdout);return 0;
#define Begin freopen("atm.in","r",stdin);freopen("atm.out","w",stdout);chul();Cu;
using namespace std;
const int maxn=500010;
struct op{
	int to,next;
}r[maxn<<1],t[maxn<<1];
struct STACK{
	int poi,a[maxn];
	void push(int x){
		poi++;
		a[poi]=x;
	}
	int pop(){
		poi--;
		return a[poi+1];
	}
}q;
struct QUEUE{
	int head,tail,a[maxn];
	int F(int x){
		return ((x%maxn)+maxn)%maxn;
	}
	int front(){
		return a[F(head)];
	}
	void push(int x){
		a[F(++tail)]=x;
	}
	void pop(){
		head++;
	}
	bool empty(){
		return head>tail;
	}
}qe;
int dfn[maxn],low[maxn],bel[maxn],pay[maxn],cpay[maxn],head[maxn],nhead[maxn],dis[maxn];
bool jb[maxn],cjb[maxn],flag[maxn];
int tim,clr;
int n,m,s;
int min(int x,int y){
	if(x>y)return y;
	return x;
}
int max(int x,int y){
	if(x>y)return x;
	return y;
}
void dfs(int rt){
	tim++;
	dfn[rt]=low[rt]=tim;
	flag[rt]=1;
	q.push(rt);
	int y;
	for(int i=head[rt];i;i=r[i].next){
		y=r[i].to;
		if(!dfn[y]){
			dfs(y);
			low[rt]=min(low[rt],low[y]);
		}
		else if(flag[y]){
			low[rt]=min(low[rt],dfn[y]);
		}
	}
	if(low[rt]!=dfn[rt])return;
	int t;
	clr++;
	do{
		t=q.pop();
		flag[t]=0;
		bel[t]=clr;
		cpay[clr]+=pay[t];
		if(jb[t]){
			cjb[clr]=1;
		}
	}while(t!=rt);
}
void insert(int fr,int to){
	tim++;
	r[tim].to=to;
	r[tim].next=head[fr];
	head[fr]=tim;
}
void reinsert(int fr,int to){
	tim++;
	t[tim].to=to;
	t[tim].next=nhead[fr];
	nhead[fr]=tim;
}
void lessenpoint(){
	int y;
	for(int i=1;i<=clr;i++){
		for(int j=1;j<=n;j++){
			if(bel[j]!=i)continue;
			for(int k=head[j];k;k=r[k].next){
				y=r[k].to;
				if(bel[y]==i)continue;
				reinsert(i,bel[y]);
			}
		}
	}
}
int spfa(){
	memset(flag,0,sizeof(flag));
	int x=bel[s];
	int ans=cpay[x];
	dis[x]=cpay[x];
	qe.push(x);
	flag[x]=1;
	int y;
	while(!qe.empty()){
		x=qe.front();
		qe.pop();
		flag[x]=0;
		for(int i=nhead[x];i;i=t[i].next){
			y=t[i].to;
			dis[y]=max(dis[x]+cpay[y],dis[y]);
			if(cjb[y]){
				ans=max(ans,dis[y]);
			}
			if(!flag[y]){
				flag[y]=1;
				qe.push(y);
			}
		}
	}
	return ans;
}
void chul(){
	scanf("%d%d",&n,&m);
	int fr,to;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&fr,&to);
		insert(fr,to);
	}
	for(int i=1;i<=n;i++){
		scanf("%d",&pay[i]);
	}
	
	scanf("%d%d",&s,&fr);
	for(int i=1;i<=fr;i++){
		scanf("%d",&to);
		jb[to]=1;
	}
	tim=0;
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			dfs(i);
		}
	}
	tim=0;
	lessenpoint();
	printf("%d\n",spfa());
}
int main(){
	Begin;
}