看第一篇题解的思路写的
炸了
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<ctime>
#include<complex>
#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-'0';ch=getchar();}
return x*f;
}
const int N=2e6+10;
int n,cnt,s,ans,st,s1,s2;
int tot,head[N],val[N],to[N],nex[N];
int vis[N],book[N],r[N];
int dis[N],f[N],sum[N];
inline void add(int u,int v,int w){
to[++tot]=v;
val[tot]=w;
nex[tot]=head[u];
head[u]=tot;
}
inline bool dfs1(int u,int fa){
if(vis[u]==1){
vis[u]=2;
r[++cnt]=u;
book[u]=1;
return 1;
}
vis[u]=1;
for(int i=head[u];i;i=nex[i]){
if(i==((fa-1)^1)+1)
continue;
if(dfs1(to[i],i)){
int w=val[i];
if(vis[u]!=2){
sum[++cnt]=sum[cnt-1]+w;
r[cnt]=u;
book[u]=1;
return 1;
}
else{
sum[st-1]=sum[st]-w;
return 0;
}
}
}
return 0;
}
inline void dfs2(int u){
book[u]=1;
for(int i=head[u];i;i=nex[i]){
int v=to[i];
if(book[v])
continue;
dfs2(v);
s=max(s,dis[u]+dis[v]+val[i]);
dis[u]=max(dis[u],dis[v]+val[i]);
}
}
inline int solve(int root){
st=cnt+1;
s1=0,s2=0;
dfs1(root,0);
for(int i=st;i<=cnt;i++){
s=0;
dfs2(r[i]);
s1=max(s1,s);
int x=i+cnt-st+1;
f[x]=f[i]=dis[r[i]];
sum[x]=sum[x-1]+sum[i]-sum[i-1];
}
deque<int> q;
for(int i=st;i<=2*cnt-st+1;i++){
while(!q.empty()&&q.front()<=i-cnt+st-1)
q.pop_front();
if(!q.empty())
s2=max(s2,f[i]+f[q.front()]+sum[i]-sum[q.front()]);
while(!q.empty()&&f[q.back()]-sum[q.back()]<=f[i]-sum[i])
q.pop_back();
q.push_back(i);
}
return max(s1,s2);
}
signed main()
{
n=read();
for(int i=1;i<=n;i++){
int v=read(),w=read();
add(i,v,w);
add(v,i,w);
}
for(int i=1;i<=n;i++)
if(!book[i])
ans+=solve(i);
printf("%lld",ans);
return 0;
}