只有第三个点没wa
#include<bits/stdc++.h>
using namespace std;
int head[1010000],cnt,flag;
long long p[1010000],n,x,y,dp[1010000][2],dp2[1010000][2];
bool vis[1010000];
struct edge{
int from,to;
}e[6100000];
void add(int u,int v)
{
e[++cnt].from=head[u];
head[u]=cnt;
e[cnt].to=v;
// e[cnt].val=w;
}
void find(int u,int fa)
{
for(int i=head[u];i;i=e[i].from)
{
// if(flag) 去掉注释后运行不出来
// {
// return ;
// }
int v=e[i].to ;
if(v==fa)
{
continue;
}
// cout<<"v"<<v<<"u"<<u<<endl;
if(vis[v])
{
x=u;
y=v;
flag=1;
return ;
}
vis[v]=1;
find(v,u);
}
}
void dfs(int u,int fa,int no)
{
for(int i=head[u];i;i=e[i].from )
{
int v=e[i].to ;
if(v==fa)
{
continue;
}
if(v==no)
{
continue;
}
dfs(v,u,no);
dp[u][1]+=dp[v][0];
dp[u][0]+=max(dp[v][0],dp[v][1]);
}
}
void dfs2(int u,int fa,int no)
{
for(int i=head[u];i;i=e[i].from )
{
int v=e[i].to ;
if(v==fa)
{
continue;
}
if(v==no)
{
continue;
}
dfs2(v,u,no);
dp2[u][1]+=dp2[v][0];
dp2[u][0]+=max(dp2[v][0],dp2[v][1]);
}
}
void check()
{
for(int i=1;i<=n;i++)
{ cout<<dp[i][1]<<" "<<dp[i][0]<<endl;
//printf("dp[%d][0] %d dp[%d][1] %d\n",i,dp[i][0],i,dp[i][1]);
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p[i];
int go;
cin>>go;
add(i,go);
add(go,i);
dp[i][1]=p[i];
dp2[i][1]=p[i];
}//
long long ans=0;
for(int i=1;i<=n;i++){
if(!vis[i])
{
vis[i]=1;
find(i,-1);
// cout<<x<<y;
if(flag==1)
{
dfs(x,y,x);
//check();
dfs2(y,x,y);
ans+=max(dp[x][0],dp2[y][0]);//cout<<"here";
}
if(flag==0)
{
dfs(i,-1,-1);
ans+=max(dp[i][1],dp[i][0]);
}
flag=0;
}
}
// ans++;
cout<<ans;
return 0;
}
/*
9
20 4
25 5
15 4
26 5
41 6
10 2
10 8
20 9
30 7
*/