15pts求调(diao)
查看原帖
15pts求调(diao)
1385996
ZSYhaouuan楼主2025/7/25 11:28

我感觉是一个特别的问题,但又找不出来。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 2e5+100;
ll n, m;
ll k[N];
vector<ll> G1[N], G2[N];
ll dfn[N], scc[N], low[N], dfncnt, scccnt;
ll val[N], maxn[N];
bool is_stack[N];
stack<ll> s;
void dfs(ll u) {
	dfn[u] = low[u] = ++dfncnt;
	s.push(u);
	is_stack[u] = 1;
	for (auto v : G1[u]) {
		if (!dfn[v]) {
			dfs(v);
			low[u] = min(low[u], low[v]);
		} else if (is_stack[v]) {
			low[u] = min(low[u], dfn[v]);
		}
	}
	if (dfn[u] == low[u]) {
		scccnt++;
		while (1) {
			ll x = s.top();
			s.pop();
			scc[x] = scccnt;
			val[scccnt] += k[x];
			maxn[scccnt] = max(maxn[scccnt], k[x]);
			if (x == u) break;
			is_stack[x]=0;
		}
	}
	return;
}
ll ans1, ans2;
bool vis[N];
ll f[N], g[N];
ll dfs2(ll x) {
	if (vis[x]) return f[x];
	vis[x] = 1;
	ll max_sum = 0, max_kite = 0;
	for (auto y : G2[x]) {
		ll tmp_sum = dfs2(y);
		if (tmp_sum > max_sum || (tmp_sum == max_sum && g[y] > max_kite)) {
			max_sum = tmp_sum;
			max_kite = g[y];
		}
	}
	f[x] = val[x] + max_sum;
	g[x] = max(maxn[x], max_kite);
	return f[x];
}
ll ind[N];
int main() {
	cin >> n >> m;
	for (ll i = 1; i <= n; i++) cin >> k[i];
	for (ll i = 1; i <= m; i++) {
		ll x, y;
		cin >> x >> y;
		G1[x].push_back(y);
	}
	for (ll i = 1; i <= n; i++) if (!dfn[i]) dfs(i);
	for (ll x = 1; x <= n; x++) {
		for (auto y : G1[x]) {
			if (scc[x] == scc[y]) continue;
			G2[scc[x]].push_back(scc[y]);
			ind[scc[y]]++;
		}
	}
	for (ll i = 1; i <= scccnt; i++) if (!ind[i]) dfs2(i);
	for(ll i=1;i<=scccnt;i++){
		if(f[i] > ans1 || (f[i] == ans1 && g[i] > ans2)){
			ans1 = f[i];
			ans2 = g[i];
		}
	}
	cout<<ans1<<" "<<ans2;
	return 0;
}
2025/7/25 11:28
加载中...