记录编号 |
576671 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[ZJOI 2008] 骑士 |
最终得分 |
100 |
用户昵称 |
ZRQ |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.821 s |
提交时间 |
2022-10-14 22:43:24 |
内存使用 |
18.31 MiB |
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2000005;
int n;
ll a[N],ans,f[N][2];
bool vis[N];
int hd[N],idx=1,e[N<<1],nt[N<<1],del,rt1,rt2;
inline void add(int x,int y)
{
nt[++idx]=hd[x],hd[x]=idx,e[idx]=y;
}
void DFS(int cur,int lst)
{
vis[cur]=1;
for(int i=hd[cur];i;i=nt[i])
{
if(e[i]==lst) continue;
if(!vis[e[i]]) DFS(e[i],cur);
else
{
rt1=cur;
rt2=e[i];
del=i;
}
}
return ;
}
void dp(int cur,int lst)
{
f[cur][0]=0;
f[cur][1]=a[cur];
for(int i=hd[cur];i;i=nt[i])
{
if(e[i]==lst||i==del||i==(del^1)) continue;
dp(e[i],cur);
f[cur][0]+=max(f[e[i]][0],f[e[i]][1]);
f[cur][1]+=f[e[i]][0];
}
return ;
}
int main()
{
freopen("bzoj_1040.in","r",stdin);
freopen("bzoj_1040.out","w",stdout);
scanf("%d",&n);
for(int i=1,x;i<=n;++i) scanf("%lld%d",&a[i],&x),add(x,i),add(i,x);
for(int i=1;i<=n;++i)
if(!vis[i])
{
DFS(i,-1);
dp(rt1,-1);
ll k=f[rt1][0];
dp(rt2,-1);
k=max(k,f[rt2][0]);
ans+=k;
}
printf("%lld\n",ans);
return 0;
}