好像是DP的问题,但是我调不出来QAQ
目前就是MLE+TLE+WA,毫无疑问是死循环了
//2023/7/13
//别着急,先通读一遍题目
//别忘了开long long
//写完先看一遍怎么降复杂度
//要么开全局变量要么给定初值
//想想看,有什么情况需要特判
//看看数组开的够不够大
//std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int num,ans;
struct linkstar{
int from,to,next,w;
}edge[2*MAXN];
int head[MAXN];
int escnt=0;
void add(int from,int to)
{
edge[++escnt].from=from;
edge[escnt].to=to;
edge[escnt].next=head[from];
head[from]=escnt;
}
int f1[MAXN][2],f2[MAXN][2];
int a[MAXN];
int bk,ht;
bool vis[MAXN];
int root;
void dp1(int x,int fa)
{
//if(x==ht) return;
f1[x][1]=a[x];
//cout<<x<<endl;
for (int i=head[x];i!=-1;i=edge[i].next){
int y=edge[i].to;
if(y==fa) continue;
if(i==root||(i^1)==root) continue;
dp1(y,x);
f1[x][0]+=max(f1[y][0],f1[y][1]);
f1[x][1]+=f1[y][0];
}
}
void dp2(int x,int fa)
{
//if(x==bk) return;
f2[x][1]=a[x];
for (int i=head[x];i!=-1;i=edge[i].next){
int y=edge[i].to;
if(y==fa) continue;
if(i==root||(i^1)==root) continue;
dp2(y,x);
f2[x][0]+=max(f2[y][0],f2[y][1]);
f2[x][1]+=f2[y][0];
}
}
void dfs(int x,int fa)
{
vis[x]=1;
for (int i=head[x];i!=-1;i=edge[i].next){
int y=edge[i].to;
if(y==fa) continue;
if(!vis[y]) dfs(y,x);
else{
bk=x;
ht=y;
root=i;
return;
}
}
}
int main()
{
memset(head,-1,sizeof(head));
int n,pos;
cin>>n;
for (int i=1;i<=n;i++){
cin>>a[i]>>pos;
add(pos,i);
add(i,pos);
}
for (int i=1;i<=n;i++){
if(!vis[i]){
ht=bk=0;
dfs(i,0);
//cout<<ht<<" "<<bk<<endl;
if(bk&&ht){
dp1(bk,0);
dp2(ht,0);
ans+=max(f1[bk][0],f2[ht][0]);
//cout<<ans<<endl;
}
}
}
cout<<ans<<endl;
return 0;
}