#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 1e6+5;
vector<int> adj[MAXN];
int f[MAXN], w[MAXN], in[MAXN], mx[2][MAXN], ansc[MAXN], marc[MAXN], comp;
void dfs(int s){
marc[s] = 1;
comp = max({comp, ansc[s], mx[0][s]+mx[1][s]});
for(int viz : adj[s])
if(!marc[viz])dfs(viz);
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n; cin>>n;
for(int i = 1; i <= n; i++){
cin>>f[i]>>w[i];
in[f[i]]++;
adj[i].push_back(f[i]);
adj[f[i]].push_back(i);
}
queue<int> q;
for(int i = 1; i <= n; i++)
if(in[i] == 0)q.push(i);
while(!q.empty()){
int x = q.front(); q.pop();
in[ f[x] ]--; if(in[f[x]] == 0)q.push(f[x]);
if(mx[0][f[x]] < mx[0][x] + w[x]){
mx[1][f[x]] = mx[0][f[x]];
mx[0][f[x]] = mx[0][x] + w[x];
}else if(mx[1][f[x]] < mx[0][x] + w[x])mx[1][f[x]] = mx[0][x] + w[x];
}
for(int i = 1; i <= n; i++)
if(in[i] == 1 && marc[i] == 0){
int cur = i, tot = 0;
while(1){
marc[cur] = 1;
tot += w[cur];
cur = f[cur];
if(cur == i)break;
}
int x = 0, y = 0, d = 0; cur = i;
while(1){
if(cur != i){
ansc[cur] = max(x + mx[0][cur]+d, y + mx[0][cur]-d+tot);
x = max(x, mx[0][cur]-d);
y = max(y, mx[0][cur]+d);
}else{
x = mx[0][cur]-d;
y = mx[0][cur]+d;
}
d += w[cur]; cur = f[cur];
if(cur == i)break;
}
}
for(int i = 1; i <= n; i++)marc[i] = 0;
int ans = 0;
for(int i = 1; i <= n; i++)
if(!marc[i]){
comp = 0;
dfs(i);
ans += comp;
}
cout<<ans<<"\n";
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |