```
#include<iostream>
#include<cstdio>
using namespace std;
#define N 2000010
struct edge
{
int next;
int to;
} e[N];
int head[N];
bool flag[N];
int p[N];
long long dp[N][2];
int n;
long long ans;
int A,B;
int cnt;
inline int read(){
int f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return f*x;
}
void add(int a,int b){
e[++cnt].to=b;
e[cnt].next=head[a];
head[a]=cnt;
}
inline void dfs(int u,int fa){
dp[u][1]=p[u];dp[u][0]=0;
int v;
for(register int i=head[u];i;i=e[i].next){
v=e[i].to;
if(v==fa) continue;
dfs(v,u);
dp[u][1]+=dp[v][0];
dp[u][0]+=max(dp[v][1],dp[v][0]);
}
return;
}
int main()
{
n=read();
int hate,power;
bool find=0;
for(register int i=1;i<=n;i++){
power=read();hate=read();
p[i]=power;
if(!find&&flag[hate]&&flag[i]){
find=1;
A=hate;B=i;
continue;
}
flag[hate]=flag[i]=1;
add(hate,i);
add(i,hate);
}
dfs(A,A);
ans=dp[A][0];
dfs(B,B);
ans=max(ans,dp[B][0]);
printf("%lld",ans);
return 0;
}
```
by OI_lover @ 2018-10-10 14:17:11
只有20分......
by OI_lover @ 2018-10-10 14:18:08
你好垃圾啊
by _skyline @ 2018-10-10 14:25:53
这么简单都不会
by _skyline @ 2018-10-10 14:26:04
https://www.luogu.org/paste/p1z8w7hj
by _skyline @ 2018-10-10 14:28:07
果然天秀
by Dispwnl @ 2018-10-10 15:09:39
某位素质感人
by xMinh @ 2018-10-10 15:11:23
这就更有趣了
禁言警告
by PBCWZCC @ 2018-10-10 16:20:14
不好意思,本人是被某位~~(你知道的)~~,话说一个机房的要不要这么**_残忍_**,我刚刚才发现
by _skyline @ 2018-11-01 17:20:59