rt
// Problem: P4381 [IOI2008] Island
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4381
// Memory Limit: 250 MB
// Time Limit: 1000 ms
//
// By:lmq
// AC Time:2024-06-12 16:21:58
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
const int N=1e6+5e5;
struct edge{
signed v;
int w;
signed id;
};
struct node{
int val;
signed id;
};
int n,ans;
bool hd[N];
bool vis[N],ved[N];
map<pair<signed,signed>,int> mp;
vector<signed> h;
vector<int> s,d;
vector<edge> g[N];
deque<node> q;
int dfs_zh(int u){
vis[u]=1;
for(edge i:g[u]){
if(ved[i.id])continue;
ved[i.id]=1;
int v=i.v;
if(!vis[v]){
int t=dfs_zh(v);
if(t){
if(t!=-1){
mp[{u,v}]=max(i.w,mp[{u,v}]);
mp[{v,u}]=max(i.w,mp[{v,u}]);
hd[u]=1;
h.push_back(u);
}
return t==-1||t==u?-1:t;
}
}else{
hd[u]=1;
mp[{u,v}]=max(i.w,mp[{u,v}]);
mp[{v,u}]=max(i.w,mp[{v,u}]);
h.push_back(u);
return v;
}
}
return 0;
}
pair<int,int> dfs_lst(int u,int fa,int rt){
vis[u]=1;
int s=0,ret=0;
s=u;
for(edge i:g[u]){
int v=i.v,w=i.w;
if((!hd[v]||v==rt)&&v!=fa){
pair<int,int> t=dfs_lst(v,u,rt);
int sv=t.first,st=t.second;
if(st+w>ret)
ret=st+w,s=sv;
}
}
return {s,ret};
}
inline int trd(int u){
return dfs_lst(dfs_lst(u,u,u).first,-1,u).second;
}
int work(int u){
int ret=0;
q.clear();
d.clear();
s.clear();
h.clear();
mp.clear();
dfs_zh(u);
int l=h.size();
for(int i=0;i<l;i++)
h.push_back(h[i]);
s.push_back(0);
for(int i=1;i<h.size();i++)
s.push_back(mp[{h[i-1],h[i]}]);
for(int i=1;i<s.size();i++)
s[i]+=s[i-1];
for(int rt:h){
ret=max(ret,trd(rt));
d.push_back(dfs_lst(rt,rt,rt).second);
}
for(int i=1;i<h.size();i++){
while(!q.empty()&&q.front().id<i-l+1)
q.pop_front();
while(!q.empty()&&q.back().val<d[i-1]-s[i-1])
q.pop_back();
q.push_back({d[i-1]-s[i-1],i-1});
ret=max(ret,d[i]+s[i]+q.front().val);
}
return ret;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
int v=read(),w=read();
g[i].push_back({v,w,i});
g[v].push_back({i,w,i});
}
for(int i=1;i<=n;i++)
if(!vis[i])
ans+=work(i);
cout<<ans<<endl;
return 0;
}
// 某一日,祂从天坠落。人们抬头仰望,于是看见了星空。
// 星月送来神的女儿,她愿成为人的伴侣。
// 长风化作她的轺车,四海落成她的园圃。鸟雀衔来善的种子,百花编织爱的颂歌。
// 她便是这样降生于世,行于大地,与人类一同长大,与世界一起发芽。
// 而今,「终焉」之时将至。
// 而今,「归去」之时已至。
// 就此告别吧,美丽的世界。
// 此后,将有「群星」闪耀,因为我如今来过。
// 此后,将有「百花」绽放,因为我从未离去。
// 请将我的箭、我的花、与我的爱,织成新生的种子,带向那枯萎的大地。
// 然后,便让它开出永恒而无瑕的…「人性之华」吧。
// 「我名为爱莉希雅……」
// 「最初的律者,人之律者。」