问答题 对于一个使用邻接表存储的带权有向图G,试利用深度优先搜索方法,对该图中所有顶点进行拓扑排序。若邻接表的数据类型为graph,则算法对应函数的说明为 int dfs_toposort(graph *g) 若函数返回1,则表示拓扑排序成功,图中不存在环;若函数返回0,则图中存在环,拓扑排序不成功。在这个算法中嵌套调用一个递归的深度优先搜索算法为 dfs1(graph *g, int v) 在遍历图的同时进行拓扑排序,给出整个算法的实现。
【正确答案】int visited[Vnum]; int finished[Vnum];//表示对顶点i的DFS搜索是否结束 void dfs1(graph *g,int v,int &flag) //在深度优先遍历时输出顶点号。若图中不存在环,则输出全部顶点 //号,即为有向图的顶点拓扑排序,否则将flag置为0 { arcnode *p; cout<<v<<" ";finished[v]=0; visited[v]=1; p=g→adjlist[v].firstarc; while(p!=NULL) { if(visited[p→adjvex]==1 && finished[p→adjvex]==0) flag=0; else if(visited[p→adjvex]==0) { dfs1(g,p→adjvex,flag); finished[p→adjvex]=1; } p=p→nextarc; } } int dfs_toposort(graph *g) { int flag=1,i; for(i=0;i<g→vexnum;++i) visited[i]=0; for(i=0;i<g→vexnum;++i) finished[i]=1; i=0; while(flag==1 && i<g→vexnum) { if(visited[i]==0) dfs1(g,i,flag); else ++i; //找另一个分支继续 finished[i]=1; //标记顶点i的搜索已结束 } return flag; }
【答案解析】