codeforces 767C (dfs)

来源:互联网 发布:软件qa工程师 编辑:程序博客网 时间:2024/04/28 21:36

比赛的时候卡题卡的厉害,虽然想到正确的方法了,但是因为有点迷糊,给糊里糊涂的叉了
由于子树的子树里再出现等于sum/3的情况,那么dp[u]=0,就可以很好的避免计算情况了

#include <cstdio>#include <iostream>#include <vector>using namespace std;#define pb push_backtypedef long long ll;const int N=1e6+5;int n,root,sum,v1,v2,dp[N];vector<int> g[N];void dfs(int u){    for(int v:g[u])        dfs(v),dp[u]+=dp[v];    if(dp[u]==sum/3&&u!=root)        if(!v1) v1=u,dp[u]=0;        else if(!v2){v2=u,dp[u]=0;return;}}int main(){    scanf("%d",&n);    for(int i=1,p;i<=n;i++)    {        scanf("%d%d",&p,&dp[i]);        sum+=dp[i];        g[p].pb(i);        if(!p)root=i;    }    if(sum%3)return puts("-1"),0;    dfs(root);    if(v1&&v2)printf("%d %d",v1,v2);    else puts("-1");}
0 0
原创粉丝点击