阅读以下说明和C语言函数,将应填入 (n) 处的字句写在对应栏内。
[说明]
在一个分布网络中,资源(石油、天然气、电力等)可从生产地送往其他地方。在传输过程中,资源会有损耗。例如,天然气的气压会减少,电压会降低。我们将需要输送的资源信息称为信号。在信号从信源地送往消耗地的过程中,仅能容忍一定范围的信号衰减,称为容忍值。分布网络可表示为一个树形结构,如图21-7所示。信号源是树根,树中的每个结点(除了根)表示一个可以放置放大器的子结点,其中某些结点同时也是信号消耗点,信号从一个结点流向其子结点。
每个结点有一个d值,表示从其父结点到该结点的信号衰减量。例如,在图21-7中,结点w、p、q的d值分别为2、1、3,树根结点表示信号源,其d值为0。
每个结点有一个M值,表示从该结点出发到其所有叶子结点的信号衰减量的最大值。显然,叶子结点的M值为0。对于非叶子结点j,M[j)=maxM(k)+d(k)k是j的孩子结点)。在此公式中,要计算结点的M值,必须先算出其所有子结点的M值。
在计算M值的过程中,对于某个结点i,其有一个子结点k满足d(k)+M(k)大于容忍值,则应在k处放置放大器;否则,从结点i到某叶子结点的信号衰减量会超过容忍值,使得到达该叶子结点时信号不可用,而在结点i处放置放大器并不能解决到达叶子结点的信号衰减问题。
例如,在图21-7中,从结点p到其所有叶子结点的最大衰减值为4。若容忍值为3,则必须在s处放置信号放大器,这样可使得结点p的M值为2。同样,需要在结点q、v处放置信号放大器,如图21-8中阴影结点所示。若在某结点放置了信号放大器,则从该结点输出的信号与信号源输出的信号等价。
函数placeBoosters(TreeNode *root)的功能是:对于给定树形分布网络中各个结点,计算其信号衰减量的最大值,并确定应在树中的哪些结点放置信号放大器。
全局变量Tolerance保存信号衰减容忍值。
树的结点类型定义如下:
typedef struct TreeN(Dde
int id; /*当前结点的识别号*/
int childNum; /*当前结点的子结点数目*/
int d; /*父结点到当前结点的信号衰减值*/
struct TreeN()de **childptr; /*向量,存放当前结点到其所有子结点的指针*/
int M; /*当前结点到其所有子结点的信号衰减值中的最大值*/
bool boost; /*是否在当前结点放置信号放大器的标志*/
TreeNode;
[C语言函数]
void placeB00sters(TreeNode *root)
/*计算root所指结点处的衰减量,如果衰减量超出了容忍值,则放置放大器*/
TreeNode *p;
int i,degradation;
if ( (1) )
degradation=0;root->M=0;
i=0;
if(i>=root->ChildNum)
return;
p= (2) ;
for(;i<root->ChildNum &&p;i++,p= (3) )
p->M=0;
(4) ;
if(p->d+p->M>Tolerance)/*在p所指结点中放置信号放大器*/
p->Doost=true;
p->M=0;
if(p->d+p->M>degradation)
degradation=p->d+p->M;
root->M= (5) ;
(2)处填()。