70pts 只有WA
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,dfn[N],stamp,f[N],ring[N];
long long sum[N*2],Max[N],d1[N],d2[N];
map<pair<int,int>,int>mp;
vector<int>vec;
struct graph{
int v,w,id;
};
vector<graph>g[N];
void dfs(int u,int last){
dfn[u]=++stamp;
for(auto [v,w,id]:g[u]){
if(id!=last){
if(dfn[v]){
if(dfn[v]>dfn[u]){
vec.push_back(v),ring[v]=1;
while(v!=u){
v=f[v],vec.push_back(v),ring[v]=1;
}
}
}
else{
f[v]=u,dfs(v,id);
}
}
}
}
void dfs1(int u,int last){
for(auto [v,w,id]:g[u]){
if(id!=last&&!ring[v]){
dfs1(v,id);
if(d1[v]+w>=d1[u]){
d2[u]=d1[u],d1[u]=d1[v]+w;
}
else if(d1[v]+w>=d2[u]){
d2[u]=d1[v]+w;
}
}
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int u=1,v,w;u<=n;u++){
cin>>v>>w,g[u].push_back({v,w,u}),g[v].push_back({u,w,u}),mp[{u,v}]=w;
}
long long ans=0;
for(int i=1;i<=n;i++){
if(!dfn[i]){
long long num=0;
vec.clear(),dfs(i,0),reverse(vec.begin(),vec.end());
for(int i:vec){
dfs1(i,0),num=max(num,d1[i]+d2[i]);
}
int len=vec.size();
for(int i=0;i<len;i++){
vec.push_back(vec[i]);
}
for(int i=1;i<vec.size();i++){
sum[i]=sum[i-1]+mp[{vec[i-1],vec[i]}];
}
Max[len]=-1e18;
for(int i=len-1;i>=1;i--){
Max[i]=max(Max[i+1],d1[vec[i]]+sum[i]);
}
for(int i=0;i<len;i++){
num=max(num,d1[vec[i]]+Max[i+1]-sum[i]);
}
for(int i=len-1;i>=1;i--){
Max[i]=max(Max[i+1],d1[vec[i]]-sum[i]);
}
for(int i=0;i<len;i++){
num=max(num,d1[vec[i]]+Max[i+1]+sum[i+len]);
}
ans+=num;
}
}
cout<<ans;
}