(说明)
在一个分布网络中,资源(石油、天然气、电力等)可从生产地送往其他地方。在传输过程中,资源会有损耗。例如,天然气的气压会减少,电压会降低。我们将需要输送的资源信息称为信号。在信号从信源地送往消耗地的过程中,仅能容忍一定范围的信号衰减,称为容忍值。分布网络可表示为一个树型结构,如图10-9所示。信号源是树根,树中的每个节点(除了根)表示一个可以放置放大器的子节点,其中某些节点同时也是信号消耗点,信号从一个节点流向其子节点。
每个节点有一个d值,表示从其父节点到该节点的信号衰减量。例如,在图10-9中,节点w、p、q的d值分别为2、1、3,树根节点表示信号源,其d值为0。
每个节点有一个M值,表示从该节点出发到其所有叶子的信号衰减量的最大值。显然,叶子节点的M值为0。对于非叶子节点j,M(j)=max{M(k)+d(k)|k是j的孩子节点}。在此公式中,要计算节点的M值,必须先算出其所有子节点的M值。
在计算M值的过程中,对于某个节点i,其有一个子节点k满足d(k)+M(k)大于容忍值,则应在k处放置放大器,否则,从节点i到某叶子节点的信号衰减量会超过容忍值,使得到达该叶子节点时信号不可用,而在节点i处放置放大器并不能解决到达叶子节点的信号衰减问题。
例如,在图10-9中,从节点p到其所有叶子节点的最大衰减值为4。若容忍值为3,则必须在s处放置信号放大器,这样可使得节点p的M值为2。同样,需要在节点小v处放置信号放大器,如图10—10阴影节点所示。若在某节点放置了信号放大器,则从该节点输出的信号与信号源输出的信号等价。
函数placeBoosters(TreeNode*root)的功能是:对于给定树型分布网络中各个节点,计算其信号衰减量的最大值,并确定应在树中的哪些节点放置信号放大器。
全局变量Tolerance保存信号衰减容忍值。
树的节点类型定义如下:
typedef struct TreeNode{
int id; /*当前节点的识别号*/
int ChildNum; /*当前节点的子节点数目*/
int d; /*父节点到当前节点的信号衰减值*/
struct TreeNode **childptr; /*向量,存放当前节点到其所有子节点的指针*/
int M; /*当前节点到其所有子节点的信号衰减值中的最大值*/
bool boost; /*是否在当前节点放置信号放大器的标志*/
}TreeNode;
(C语言函数)
void placeBoosters(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->boost=true;
p->M = 0;
}
if (p->d + p->M > degradation)
degradation = p->d + p->M;
}
root->M =(5);
}
}
[试题]阅读以下说明和C语言函数,将应填入(n)处。[说明]函数int find_Max_Min(int a[],int n)的功能是:找出n个元素的数组a中的最大元素和最小元素并输出,返回查找过程中元素的比较次数。查找方法如下:比较a[0]和a[n-1],若a[0]大,则交换a[0]和a[n-1]的值:再比较a[1]和a[n-2],若a[1]大,则交换a[1]和a[n-2]的值;以此类推,直到所有的元素都比较完。然后在数组的前半区从前往后找出小元素,在后半区从后往前找出大元素。[函数]int find_
[主观题]阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。[说明]本程序实现对指定文件内的单词进行计数。其中使用二叉树结构来保存已经读入的不同单词,并对相同单词出现的次数进行计数。此二叉树的左孩子结点的字符串值小于父结点的字符串值,右孩子结点的字符串值大于父结点的字符串值。函数getword(char*filename,char*word)是从指定的文件中得到单词。char*strdup(char*S)是复制S所指向的字符串,并返回复制字符串的地址。[C程序]include <stdio
[试题]阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。(说明)实现矩阵(3行3列)的转置(即行列互换)。例如,输入下面的矩阵:100 200 300400 500 600700 800 900程序输出:100 400 700200 500 800300 600 900(函数)int fun(int array[3][3]){int i,j,t;for(i=0;(1);i++)for(j=0;(2);j++){t=array[i][j];(3);(4);}}}main(){int i,j
[主观题]阅读以下说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。[说明]求树的宽度,所谓宽度是指在二叉树的各层上,具有结点数最多的那一层的结点总数。本算法是按层次遍历二叉树,采用一个队列q,让根结点入队列,若有左右子树,则左右子树根结点入队列,如此反复,直到队列为空。[函数]int Width ( BinTree *T{int front=-1, rear=-1; /*队列初始化*/int flag=0, count=0, p; /*p用于指向树中层的最右边的结点, flag 记录层中结点
[主观题]阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。(说明)下面一段程序从给定的数组b中找出值最小的元素,并输出该元素的数组下标、内存地址minaddr以及元素值本身。函数findmin负责在给定的数组中查找最小值,并返回最小值所在的内存地址,函数有三个参数:array是所要处理的数组;size是数组的大小;index负责从函数返回具有最大值的元素在数组中的数组下标。请填充空白,使其成为一个合乎要求的完整程序。(程序)//程序开始include<iostream.h>int *find
[主观题]阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。[说明]如图所示的一圆圈上分布6个环,请在每个环中填一个数字,使得从任一环开始按顺时针所得的六位数与按逆时针所得的6位数都为素数。[函数]main ( ){int i, j, a, b, k;long m,m1,n,t,u,v;for ( n=100001;n<999999;n+2 ) /* n穷举所有 6位奇数*/{a=0;(1); /* 设 m 为一个顺转6 位数*/for ( i=1; i<=6; i++ ){t=-m/1000
[主观题]阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。[函数2.1说明]将一个正整数分解质因数。例如:输入90,打印出90=2×3×3×5。[函数2.1]fun 1 ( int n ){int i;for ( i=2;i<=n; i++){while (((1)){if (n %i==0 ){ printf ( "%d*",i );(2)}elsebreak;}}printf ( "%d",n ) ;}[函数2.2说明]下面程序的功能是:海滩上有一堆桃子,5只猴子来分。第1只
[主观题]阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。[说明]若S和T是用结点大小为1的单链表存储的两个串,试设计一个算法找出S中第一个不在T中出现的字符。查找过程是这样的,取S中的一个字符(结点),然后和T中所有的字符一一比较,直到比完仍没有相同的字符时,查找过程结束,否则再取S中下一个字符,重新进行上述过程。[函数]typedef struct node {char data;struct node *next;}LinkStrNode; //结点类型typedef LinkStrN
[试题]试题二(共 15 分)阅读以下说明和 C 语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。[说明]已知 1900 年 1 月 1 日是星期一,下面的函数 count_5_13(int year)用于计算给定的年份 year中有几个“黑色星期五” 。 “黑色星期五”指既是 13 日又是星期五的日期。函数 count_5_13(int year)首先算出年份 year 的1月 13 日是星期几,然后依次计算每个月的 13 日是星期几,若是星期五,则计数。程序中使用了函数 isLeapYear
[试题]阅读以下说明和C函数,将应填入(n)处对应栏内。[说明]基于管理的需要,每本正式出版的图书都有一个ISBN号。例如,某图书的ISBN号为“978-7-5606-2348-1”。ISBN号由13位数字组成:前三位数字代表该出版物是图书(前缀号),中间的9个数字分为三组,分别表示组号、出版者号和书名号,最后一个数字是校验码。其中,前缀号由国际EAN提供,已经采用的前缀号为978和979;组号用以区别出版者国家、地区或者语言区,其长度可为1~5位;出版者号为各出版者的代码,其长度与出版者的计划出书量直接