记录编号 426877 评测结果 AAAAAAAAAA
题目名称 [APIO2009] 抢掠计划 最终得分 100
用户昵称 GravatarAAAAAAAAAA 是否通过 通过
代码语言 C++ 运行时间 0.042 s
提交时间 2017-07-19 17:41:56 内存使用 24.18 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#define MAXN 500010
#define INF 0x3f3f3f3f
namespace IO {
	char buf[1 << 15], *fs, *ft;
	inline char gc() { return (fs == ft && (ft = (fs = buf) + fread(buf, 1, 1 << 15, stdin), fs == ft)) ? 0 : *fs++; }
	inline int qr() {
		int x = 0, ch = gc();
		while (ch<'0' || ch>'9') { ch = gc(); }
		while (ch >= '0'&&ch <= '9') { x = (x << 1) + (x << 3) + ch - '0';ch = gc(); }
		return x;
	}
}using namespace IO;
using namespace std;
/***********************************************************************************************/
struct Edge {
	int t, next;
}e[MAXN],g[MAXN];
int N, M, S, P, head1[MAXN], head2[MAXN], cnt1 = 1, cnt2 = 1;
void Add_Edge1(int from, int to) {
	e[++cnt1].t = to;e[cnt1].next = head1[from];head1[from] = cnt1;
}
void Add_Edge2(int from,int to){
	g[++cnt2].t = to;g[cnt2].next = head2[from];head2[from] = cnt2;
}
int dfn[MAXN], low[MAXN], belong[MAXN], dep, scc, val[MAXN], c[MAXN];
stack<int> s;
bool vis[MAXN];
void Tarjan(int u) {//求强连通分量
	dfn[u] = low[u] = ++dep;
	s.push(u);vis[u] = 1;
	for (int i = head1[u];i;i = e[i].next) {
		int v = e[i].t;
		if (!dfn[v]) {
			Tarjan(v);
			low[u] = min(low[u], low[v]);
		}
		else if (vis[v])low[u] = min(low[u], dfn[v]);
	}
	if (low[u] == dfn[u]) {
		int temp=0;scc++;
		while (temp != u && !s.empty()) {
			temp = s.top();
			s.pop();
			vis[temp] = 0;belong[temp] = scc;val[scc] += c[temp];
		}
	}
}
void Rebuild() {//缩点重建图
	for (int i = 1;i <= N;i++) {
		for (int j = head1[i];j;j = e[j].next) {
			if (belong[i] != belong[e[j].t]) {
				Add_Edge2(belong[i], belong[e[j].t]);
			}
		}
	}
}
int d[MAXN];
queue<int>q;
bool inq[MAXN];
void SPFA() {
	q.push(belong[S]);inq[belong[S]] = 1;
	d[belong[S]] = val[belong[S]];
	while (!q.empty()) {
		int u = q.front();
		q.pop();inq[u] = 0;
		for (int i = head2[u];i;i = g[i].next) {
			int v = g[i].t;
			if (d[u] + val[v] > d[v]) {
				d[v] = d[u] + val[v];
				if (!inq[v])q.push(v), inq[v] = 1;
			}
		}
	}
}
int main() {
	freopen("atm.in", "r", stdin);
	freopen("atm.out", "w", stdout);
	int x, y, ans = 0;
	N = qr();M = qr();
	for (int i = 1;i <= M;i++) {
		x = qr();y = qr();
		Add_Edge1(x, y);
	}
	for (int i = 1;i <= N;i++)c[i] = qr();
	S = qr();P = qr();
	for (int i = 1;i <= N;i++) { if (!dfn[i])Tarjan(i); }
	Rebuild();
	SPFA();
	for (int i = 1;i <= P;i++) {
		x = qr();
		ans = max(ans, d[belong[x]]);
	}
	printf("%d", ans);
	return 0;
}
//int chh = sb();
//int main() { ; }