我感觉是一个特别糖的问题,但又找不出来。
#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;
}