题目链接
思路:我们先深搜,有底向上回溯的过程中记录子树和等于sum/3的点就可以了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+1;
vector<int>g[maxn];
int n,num[maxn],root,x=-1,y=-1;
ll sum=0,t,cnt[maxn];
void dfs(int u,int fa,ll t)
{
cnt[u]=num[u];
for(int to:g[u])
{
if(to==fa) continue;
dfs(to,u,t);
if(cnt[to]==t&&y==-1) y=to;
else cnt[u]+=cnt[to];
}
if(y!=-1&&cnt[u]==t&&u!=root) x=u;
}
int main()
{
scanf("%d",&n);
for(int i=1,u,v;i<=n;++i)
{
scanf("%d%d",&u,&v);
if(u!=0)
{
g[u].push_back(i);
g[i].push_back(u);
}
else root=i;
num[i]=v;
sum+=v;
}
if(sum%3!=0){
printf("-1\n");return 0;
}
ll t=sum/3;
dfs(root,0,t);
if(x!=-1) printf("%d %d\n",x,y);
else printf("-1\n");
}