记录编号 301964 评测结果 AWAAWAAAAA
题目名称 [APIO2009] 抢掠计划 最终得分 80
用户昵称 Gravatar农场主 是否通过 未通过
代码语言 C++ 运行时间 0.119 s
提交时间 2016-09-03 08:29:11 内存使用 24.63 MiB
显示代码纯文本
#include<cstdio>
#include<queue>
#include<stack>
#include<vector>
#include<cstring>
#include<algorithm>
#define maxn 500000
using namespace std;
vector<int> G[maxn];
vector<int> g[maxn];
int dp[maxn]={0},s,S,n,m,time=0,D[maxn]={0},d[maxn]={0},tot=0,dt[maxn]={0},low[maxn]={0},mp[maxn]={0};
bool T[maxn]={0},t[maxn]={0},vis[maxn]={0};
queue<int> q;
#define u mp[g[f][i]]
void spfa(){
	memset(vis,0,sizeof(vis));
	q.push(s);
	dp[s]=d[s];
	vis[s]=1;
	int ans=0;
	if (t[s]==1){
		ans=dp[s];
	}
	while(!q.empty()){
		int f=q.front();
		for (int i=0;i<g[f].size();i++) if(f!=u){
			if (dp[u]<dp[f]+d[u]){
				dp[u]=dp[f]+d[u];
				if (vis[u]==0){
					vis[u]=1;
					q.push(u);
				}
			}
		}
		vis[f]=0;
		//printf("%d %d\n",f,dp[f]);
		q.pop();
	}
	for (int i=1;i<=tot;i++){
		if (dp[i]>ans&&t[i]==1) ans=dp[i];
		//printf("");
	}
	printf("%d\n",ans);
}
stack<int> st;
void makenode(int x){
	tot++;
	while(0==st.empty()){
		int p=st.top();
		mp[p]=tot;
		d[tot]+=D[p];
		t[tot]=t[tot]|T[p];
		for (int i=0;i<G[p].size();i++){
			g[tot].push_back(G[p][i]);
			//printf("	%d %d\n",tot,G[p][i]);
		}
		vis[p]=1;
		st.pop();
		if (dt[x]==dt[p]){
			break;
		}
	}
	/*for (int i=0;i<g[tot].size();i++){
		printf("%d %d\n",tot,g[tot][i]);
	}*/
	//printf("	%d\n",t[tot]);
}
void dfs(int x){
	if (vis[x]!=0) return; 
	dt[x]=++time;
	low[x]=dt[x];
	st.push(x);
	for (int i=0;i<G[x].size();i++){
		if (low[G[x][i]]==0||low[x]<low[G[x][i]]){
			dfs(G[x][i]);
		}
		if (vis[G[x][i]]==0)low[x]=min(low[x],low[G[x][i]]);
	}
//	printf("%d %d %d\n",x,dt[x],low[x]);
	if (dt[x]==low[x]) makenode(x);
}
void read(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		G[a].push_back(b);
	}
	for (int i=1;i<=n;i++){
		scanf("%d",&D[i]);
	}
	int p;
	scanf("%d%d",&S,&p);
	for (int i=1;i<=p;i++){
		int o;
		scanf("%d",&o);
		T[o]=1;
	}
}
int main(){
	freopen("atm.in","r",stdin);
	freopen("atm.out","w",stdout);
	read();
	dfs(S);
	s=mp[S];
	spfa();
/*	for (int i=1;i<=tot;i++){
		for (int j=0;j<g[i].size();j++){
			printf("%d %d\n",i,g[i][j]);
		}
		printf("\n");
	}*/
}