刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

 

试题四(共 15 分)

阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。

【说明】 图是很多领域中的数据模型,遍历是图的一种基本运算。从图中某顶点 v

出发进行广度优先遍历的过程是:

①访问顶点 v;

②访问 V 的所有未被访问的邻接顶点 W1  ,W2 ,..,Wk;

③依次从这些邻接顶点 W1 ,W2 ,..,Wk 出发,访问其所有未被访问的邻接顶 点;依此类推,直到图中所有访问过的顶点的邻接顶点都得到访问。

显然,上述过程可以访问到从顶点 V 出发且有路径可达的所有顶点。对于 从 v 出发不可达的顶点 u,可从顶点 u 出发再次重复以上过程,直到图中所有顶 点都被访问到。

例如,对于图 4-1 所示的有向图 G,从 a 出发进行广度优先遍历,访问顶点 的一种顺序为 a、b、c、e、f、d。

图 4-1

 图 4-2

 

设图 G 采用数组表示法(即用邻接矩阵 arcs 存储),元素 arcs[i][ j]定义如下:

 

 图 4-1 的邻接矩阵如图 4-2 所示,顶点 a~f 对应的编号依次为 0~5.因此,访问顶点 a 的邻接顶点的顺序为 b,c,e。

函数 BFSTraverse(Graph G)利用队列实现图 G 的广度优先遍历。

相关的符号和类型定义如下:

#define MaxN:50 /*图中最多顶点数*/ typedef int AdjMatrix[MaxN][MaxN];

typedef struct{

int vexnum,edgenum;/*图中实际顶点数和边(弧)数*/ AdjMatrix arcs; /*邻接矩阵*/

)Graph;

typedef int QElemType; enum {ERROR=0;OK=l};

代码中用到的队列运算的函数原型如表 4-1 所述,队列类型名为 QUEUE。
表 4-1 实现队列运算的函数原型及说明

 

 

【代码】

int BFSTraverse(Graph G)

{//图 G 进行广度优先遍历,图采用邻接矩阵存储

unsigned char*visited; //visited[]用于存储图 G 中各顶点的访问标 志,0 表示未访问

int v,w;u;


 

QUEUEQ Q;

∥申请存储顶点访问标志的空间,成功时将所申请空间初始化为 0 visited=(char*)calloc(G.vexnum, sizeof(char));

If(    (1) ) retum ERROR;

    (2) ; //初始化 Q 为空队列 for( v=0; v<G.vexnum; v++){

if(!visited[v]){ //从顶点 v 出发进行广度优先遍历 printf("%d”,v);//访问顶点 v 并将其加入队列 visited[v]=l;

    (3) ; while(!isEmpty(Q)){

    (4) ; //出队列并用 u 表示出队的元素 for(v=0;v<G.vexnum; w++){

if(G.arcs[u][w]!=0&&    (5) ){ //w 是 u 的邻接顶点且未访问

printf("%d”,w); //访问顶点 w visited[w]=1;

EnQueue(&Q, w);

}

}

}


 

}

 

free(visited);

return OK;

)//BFSTraverse

从下列的 2 道试题(试题五至试题六)中任选 1 道解答。请在答题纸上的 指定位置处将所选择试题的题号框涂黑。若多涂或者未涂题号框,则对题号最小 的一道试题进行评分。


使用微信搜索喵呜刷题,轻松应对考试!

答案:

1、visited==NULL
2、InitQueue(&Q)
3、EnQueue(&Q,v)
4、DeQueue(&Q,&u)
5、visited==0


解析:

  1. 第一处判断visited是否为空,如果为空则返回ERROR,表示内存分配失败。这是因为visited数组是用来标记图中各个顶点是否被访问过的,如果无法分配内存给visited数组,则无法进行广度优先遍历。所以选择"visited==NULL"。

  2. 第二处是初始化队列Q为空队列,使用InitQueue函数进行初始化。这是因为广度优先遍历需要使用队列来保存待访问的顶点,所以在开始遍历之前需要初始化队列。所以选择"InitQueue(&Q)"。

  3. 第三处是将起始顶点v加入队列Q中,使用EnQueue函数进行入队操作。这是为了从起始顶点开始进行广度优先遍历。所以选择"EnQueue(&Q, v)"。

  4. 第四处是出队操作,使用DeQueue函数将队列中的元素出队,并用变量u来接收出队的元素。这是为了依次访问队列中的顶点。所以选择"DeQueue(&Q, &u)"。

  5. 第五处是判断w是否是u的邻接顶点且未被访问过,如果是则进行访问并将w加入队列。这里使用visited数组来标记顶点是否被访问过,如果visited[w]==0,表示顶点w未被访问过。所以选择"visited[w]==0"。

创作类型:
原创

本文链接:  试题四(共 15 分) 阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share