ZOJ 2374 Marbles on a tree

来源:互联网 发布:如何删除数据库中的表 编辑:程序博客网 时间:2024/06/06 09:06

查看原题

题意

把每一个节点上的大理石均匀移到树的每一个节点上,一次只能向相邻的移一个,问最少需要多少步骤

思路

从子节点算起,大于1的就把1以外的部分向上传,小于1的就往上拿1
注意要建立一个队列保存没有子节点的节点

代码

#include <iostream>#include <queue>using namespace std;struct node{    int marbles,fathernode,childnum;}nodes[10010];int main(){    int n;    while(cin>>n){        if(n==0){            return 0;        }        queue<int>que;        int moves=0;        for(int i=1;i<=n;i++){            int childs,marble,number;            cin>>number>>marble>>childs;            nodes[number].marbles=marble;            nodes[number].childnum=childs;            if(childs==0)que.push(number);            while(childs--){                int temp;                cin>>temp;                nodes[temp].fathernode=number;            }        }        while(!que.empty()){            int i=que.front();            que.pop();            nodes[nodes[i].fathernode].childnum--;            if(nodes[nodes[i].fathernode].childnum==0)que.push(nodes[i].fathernode);            if(nodes[i].marbles>1){                int temp=nodes[i].marbles-1;                nodes[i].marbles=1;                nodes[nodes[i].fathernode].marbles+=temp;                moves+=temp;            }            if(nodes[i].marbles<1){                int temp=1-nodes[i].marbles;                nodes[i].marbles=1;                nodes[nodes[i].fathernode].marbles-=temp;                moves+=temp;            }        }        cout<<moves<<endl;    }    return 0;}
0 0