这哪有问题/怒
查看原帖
这哪有问题/怒
389540
imfkwk楼主2021/2/16 04:03

WA3 WA11

#include <bits/stdc++.h>
#define int long long
#define N 500005

using namespace std;

void read(int& x) {
	x = 0;
	int f = 1;
	
	char ch = getchar();
	while (ch < 48 || ch > 57) {
		if (ch == 45) f = -1;
		ch = getchar();
	}
	while (ch >= 48 && ch <= 57) {
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}
	
	x = x * f;
}

void write(int x) {
	if (x < 0) {
		putchar(45);
		x = -x;
	}
	if (x > 9) write(x / 10);
	putchar(x % 10 + 48);
}

//////////////////////////////////////////////////

int n, m, s, p;

int hd1[N];
int fm1[N << 1];
int to1[N << 1];
int vl1[N];
int br1[N];
int cnt1;

void add1(int x, int y) {
	++cnt1;
	fm1[cnt1] = hd1[x];
	to1[cnt1] = y;
	hd1[x] = cnt1;
}

int hd2[N];
int fm2[N << 1];
int to2[N << 1];
int vl2[N];
int br2[N];
int cnt2;

void add2(int x, int y) {
	++cnt2;
	fm2[cnt2] = hd2[x];
	to2[cnt2] = y;
	hd2[x] = cnt2;
}

int dfn[N], num;
int st[N], top;
bool in[N];
int low[N];
int cl[N], cln;

void tarjan(int u) {
	low[u] = dfn[u] = ++num;
	st[++top] = u; in[u] = 1;
	
	for (register int p = hd1[u]; p; p = fm1[p]) {
		int v = to1[p];
		if (!dfn[v]) {
			tarjan(v);
			if (low[v] < low[u]) low[u] = low[v];
			
		} else if (dfn[v] && in[v]) {
			if (dfn[v] < low[u]) low[u] = dfn[v];
		}
	}
	
	if (low[u] == dfn[u]) {
		int k;
		++cln;
		do {
			k = st[top--];
			in[k] = 0;
			cl[k] = cln;
			vl2[cln] += vl1[k];
			if (br1[k]) br2[cln] = 1;
		} while (k != u);
	}
}

map<int, map<int, bool> >flag;
int rd[N];

void ud() {
	for (register int i = 1; i <= n; ++i) {
		for (register int p = hd1[i]; p; p = fm1[p]) {
			int v = to1[p];
			if (cl[i] != cl[v] && !flag[cl[i]][cl[v]]) {
				flag[cl[i]][cl[v]] = 1;
				add2(cl[i], cl[v]);
				++rd[cl[v]];
			}
		}
	}
}

int f[N], ans;
void solve() {
	s = cl[s];
	f[s] = vl2[s];
	
	queue<int>q;
	q.push(s);
	
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		
		if (f[u] > ans && br2[u]) ans = f[u];
		
		for (register int p = hd2[u]; p; p = fm2[p]) {
			int v = to2[p];
			if (f[v] < f[u] + vl2[v]) f[v] = f[u] + vl2[v];
			--rd[v];
			if (!rd[v]) q.push(v);
		}
	}
}

signed main(void) {
	read(n); read(m);
	
	for (register int i = 1; i <= m; ++i) {
		int x, y;
		read(x); read(y);
		add1(x, y);
	}
	
	for (register int i = 1; i <= n; ++i) read(vl1[i]);
	
	read(s); read(p);
	
	for (register int i = 1; i <= p; ++i) {
		int x; read(x);
		br1[x] = 1;
	}
	
	for (register int i = 1; i <= n; ++i) {
		if (!dfn[i]) tarjan(i);
	}
	
	ud();
	solve();
	
	write(ans);
	
	return 0;
}
2021/2/16 04:03
加载中...