7.17 下面的伪代码是一个广度优先搜索算法,试以图7.29(下图)中的v0为源点执行该算法,请回答下述问题:
(1)对图中顶点vn+1,它需入队多少次?它被重复访问多少次?
(2)若要避免重复访问同一个顶点的错误,应如何修改此算法?
void BFS(ALGraph *G,int k)
{//以下省略局部变量的说明,visited各分量初值为假
InitQueue(&Q);//置空队列
EnQueue(&Q,k);//k入队
while(!QueueEmpty(&Q)){
i=DeQueue(&Q);//vi出队
visited[i]=TRUE;//置访问标记
printf("%c",G->adjlist[i].vertex;//访问vi
for(p=G->adjlist[i].firstedge;p;p=p->next)
//依次搜索vi的邻接点vj(不妨设p->adjvex=j)
if(!visited[p->adjvex])//若vj没有访问过
EnQueue(&Q,p->adjvex);//vj入队
}//endofwhile
}//BFS
7.18 试以邻接表和邻接矩阵为存储结构,分别写出基于DFS和BFS遍历的算法来判别顶点vi和vj(i<>j)之间是否有路径。
7.19 试分别写出求DFS和BFS生成树(或生成森林)的算法,要求打印出所有的树边。
7.20 写一算法求连通分量的个数并输出各连通分量的顶点集。
7.21 设图中各边的权值都相等,试以邻接矩阵和邻接表为存储结构,分别写出算法:
(1)求顶点vi到顶点vj(i<>j)的最短路径
(2)求源点vi到其余各顶点的最短路径
要求输出路径上的所有顶点(提示:利用BFS遍历的思想)
7.22 以邻接表为存储结构,写一个基于DFS遍历策略的算法,求图中通过某顶点vk的简单回路(若存在)。
7.23 写一算法求有向图的所有根(若存在),分析算法的时间复杂度。
7.24 改写7.5节的算法Print,使输出的从源点到各终点的最短路径是正向的。(提示:使用栈暂存路径)
7.25 对7.6节的NonSuccFirstTopSort算法求精,分别以邻接矩阵和邻接表作为存储结构,写出其具体算法,并分析算法的时间。
7.26 设一个有向图DAG,试以邻接矩阵和邻接表作为存储结构,写出对7.6节的DFSTopSort求精算法。为什么有向图不是DAG时,该算法不能正常工作?
7.27 利用拓扑排序算法的思想写一算法判别有向图中是否存在有向环,当有向环存在时,输出构成环的顶点。