记录编号 605016 评测结果 AAAAAAAAAA
题目名称 2449.[APIO2009] 抢掠计划 最终得分 100
用户昵称 Gravatarxxz 是否通过 通过
代码语言 C++ 运行时间 0.245 s
提交时间 2025-08-13 14:05:36 内存使用 31.48 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
void read(int &x){bool neg=false;x=0;char ch=0;while(ch<'0'||ch>'9'){if(ch=='-')neg=true;ch=getchar();}if(neg){while(ch>='0'&&ch<='9'){x=x*10+('0'-ch);ch=getchar();}}else{while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();}}return;}

int n,m,opop1,opop2,p,s,opop3;
vector<int>g[555555],newg[555555];
int stamp,col,top;
int stk[555555],dfn[555555],color[555555],low[555555],vis[555555],siz[555555],de[555555],newde[555555];
bool bar[555555],newbar[555555];
int ans;

void tarjan(int u){
    low[u]=dfn[u]=++stamp;
    stk[++top]=u;
    vis[u]=1;
    for(int i=0;i<g[u].size();i++){
        int v=g[u][i];
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(vis[v]) low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u]){
        col++;
        int v;
        do{
            v=stk[top--];
            color[v]=col;
            vis[v]=0;
            siz[col]++;
            newde[col]+=de[v];
            if(bar[v])newbar[col]=1;
            if(s==v)s=col;
        }while(v!=u);
    }
}

void new_build(){
    for(int u=1;u<=n;u++)
        for(int i=0;i<g[u].size();i++){
            int v=g[u][i];
            if(color[u]!=color[v])newg[color[u]].push_back(color[v]);
        }
}

int d[555555];
bool inq[555555];

void SPFA(int x){
    queue<int> q;
	for(int i=1;i<=543210;i++)d[i]=-(4000*500000)-555;
    d[x]=newde[x];
    q.push(x);
    inq[x]=true;
    while(!q.empty()){
        int u=q.front();q.pop();
        inq[u]=0;
        for(int i=0;i<newg[u].size();i++){
            int v=newg[u][i];
            if(d[v]<d[u]+newde[v]){
                d[v]=d[u]+newde[v];
                if(!inq[v]){
                    q.push(v);
                    inq[v]=true;
                }
            }
        }
    }
    for(int i=1;i<=col;i++){
        if(newbar[i]&&d[i]>ans){
            ans=d[i];
        }
    }
}

signed main(){
    freopen("atm.in","r",stdin);freopen("atm.out","w",stdout);
    read(n);read(m);
    for(int i=1;i<=m;i++){
        read(opop1);read(opop2);
        g[opop1].push_back(opop2);
    }
    for(int i=1;i<=n;i++){
        read(de[i]);
    }
    read(s);read(p);
    for(int i=1;i<=p;i++){
        read(opop3);
        bar[opop3]=1;
    }

	tarjan(s);
    new_build();

    for(int i=1;i<=col;i++){
        if(newg[i].size()>0){
            sort(newg[i].begin(),newg[i].end());
            auto last=unique(newg[i].begin(),newg[i].end());
            newg[i].erase(last,newg[i].end());
        }
    }

    SPFA(s);
    printf("%d",ans);
    return 0;
}