Codeforces Round #398 (Div. 2) C. Garland

来源:互联网 发布:egd网络小黄金骗局 编辑:程序博客网 时间:2024/05/21 09:34

Codeforces Round #398 (Div. 2)

C. Garland

题目链接

题目大意:

    给一棵树以及它的根节点,每个节点存一个值,题目中这个值是温度,Dima拿住这个根节点,他想把整个树剪成三段,使得三段上的温度和相等。(拿住根节点是想让根节点在中间的一段)

    直接从根节点开始DFS,每次更新子树上的温度和,如果温度和==总和/3,记录答案,除去该子树,tree[x]=0(以后DFS不再使用)    结束DFS后再判断根节点的和是否==总和/3,如果不是输出-1

#include<cstdio>using namespace std;int n,num[1000009],summ,san,ans[10],aa,root;struct E{    int next,to;}edge[2000060];int head[2000060],edge_num;int tree[1000009];void addedge(int x,int y){    edge[++edge_num].next=head[x];    edge[edge_num].to=y;    head[x]=edge_num;}void DFS(int x){    int i;    for(i=head[x];i;i=edge[i].next){        DFS(edge[i].to);        tree[x]+=tree[edge[i].to];    }    if(tree[x]==san&&aa<=1&&x!=root) tree[x]=0,ans[aa++]=x;}int main(){    freopen("Garland.in","r",stdin);    ans[0]=ans[1]=-1;    scanf("%d",&n);    int i;    for(i=1;i<=n;i++){        int a,b;        scanf("%d%d",&a,&b);        tree[i]=b;        if(a==0) root=i;        else addedge(a,i);        summ+=b;    }    if(summ%3!=0){        printf("-1");return 0;    }    san=summ/3;    DFS(root);    if(ans[0]!=-1&&ans[1]!=-1 && tree[root]==san){        printf("%d %d",ans[1],ans[0]);        return 0;    }    printf("-1");    return 0;}
0 0
原创粉丝点击