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