80pts求调
查看原帖
80pts求调
1068608
1111ABC楼主2025/2/2 20:27

WA on #4 #7

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>

using namespace std;

const int MAXN=1e4+5, MAXM=1e5+5;
int n, m, a[MAXN];

int timer, vis[MAXN];
int dfn[MAXN], low[MAXN];
vector <int> G[MAXN], H[MAXN];
struct Stack {
	int top, num[MAXN];
}stk;
int id[MAXN];
struct Edge {
	int u, v;
}e[MAXM];

void Tarjan (int u, int fa) {
	low[u]=dfn[u]=++timer;
	vis[u]=true;
	stk.num[++stk.top]=u;
	
	for (int v:G[u]) {
		if (v==fa) continue;
		if (dfn[v]) {
			low[u]=min (low[u], dfn[v]);
			continue;
		}
		Tarjan (v, u);
		low[u]=min (low[v], low[u]);
	}
	if (low[u]==dfn[u]) {
		while (true) {
			if (u!=stk.num[stk.top])
				a[u]+=a[stk.num[stk.top]];
			id[stk.num[stk.top]]=u;
			if (stk.num[stk.top]==u) {
				stk.top--;
				break;
			}
			stk.top--;
		}
	}
}

int f[MAXN];
int F (int u) {
	if (vis[u]) return f[u];
	vis[u]=true;
	for (int v:H[u])
		f[u]=max (F(v), f[u]);
	f[u]+=a[u];
	return f[u];
}

int ans;

int main () {
	freopen("P3387.in", "r", stdin);
	freopen("P3387.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for (int i=1; i<=n; i++) scanf("%d", &a[i]);
	for (int i=1; i<=n; i++) id[i]=i;
	for (int i=1; i<=m; i++) {
		int u, v;
		scanf("%d%d", &u, &v);
		e[i]=(Edge){u, v};
		G[u].push_back(v);
	}
	
	for (int i=1; i<=n; i++)
		if (!vis[i]) Tarjan (i, 0);
	
	
	for (int i=1; i<=m; i++) {
		e[i].u=id[e[i].u], e[i].v=id[e[i].v];
		if (e[i].u==e[i].v) continue;
		H[e[i].u].push_back(e[i].v);
	}
	
	memset (vis, 0, sizeof vis);
	for (int i=1; i<=n; i++)
		if (!vis[i]&&id[i]==i) ans=max (ans, F(i));
	
	printf("%d\n", ans);
	return 0;
}
2025/2/2 20:27
加载中...