40分,求调qwq
查看原帖
40分,求调qwq
126972
Kevinx楼主2023/10/11 13:36

测评结果

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int N = 1e5 + 20, M = 1e5 + 20;
ll n, m, a[N], x, y;
ll dfn[N], low[N], t;
ll val[N], to[N], tot = 0, in[N];
ll f[N], b[N], cnt = 0;
stack<ll> S;
bool flag[N];
vector<ll> G[N], New[N];
vector<ll> In[N], Out[N];
queue<ll> q;
void tarjan(ll u) {
	dfn[u] = low[u] = ++t;
	S.push(u);
	flag[t] = 1;
	for(int i = 0; i < G[u].size(); i++) {
		ll v = G[u][i];
		if(!dfn[v]) {
			tarjan(v);
			low[u] = min(low[u], low[v]);
		}
		else if(flag[v] == 1) low[u] = min(low[u], dfn[v]);
	}
	if(low[u] == dfn[u]) {
		val[++tot] += a[u];
		to[u] = tot;
		while(!S.empty()&& S.top() != u) flag[S.top()] = 0, to[S.top()] = tot, val[tot] += a[S.top()], S.pop();
		S.pop();
	}
}
void TP() {
	for(int i = 1; i <= tot; i++) {
		if(in[i] == 0) q.push(i);
	}
	while(!q.empty()) {
		ll u = q.front();
		q.pop();
		b[++cnt] = u;
		for(int i = 0; i < New[u].size(); i++) {
			ll v = New[u][i];
			in[v] --;
			if(in[v] == 0) q.push(v);
		}
	}
}
int main (){
	scanf("%lld%lld", &n, &m);
	for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
	for(int i = 1; i <= m; i++) {
		scanf("%lld%lld", &x, &y);
		G[x].push_back(y);
	}
	for(int i = 1; i <= n; i++) if(!dfn[i]) tarjan(i);
	for(int i = 1; i <= n; i++) {
		for(int j = 0; j < G[i].size(); j++) {
			ll u = i, v = G[u][j];
			if(to[u] != to[v]) {
				New[to[u]].push_back(to[v]);
//				Out[u].push_back(v);
		        In[v].push_back(u);
				in[v] ++;
			}
		}
	}
	TP();
	ll maxx = 0;
	for(int i = 1; i <= cnt; i++) {
		ll v = b[i];
		f[v] = val[v];
		for(int j = 0; j < In[v].size(); i++) {
			ll u = In[v][i];
			f[v] = max(f[v], f[u] + val[v]);
		}
		maxx = max(f[v], maxx);
	}
	printf("%lld", maxx);
	return 0;
}
2023/10/11 13:36
加载中...