问答题 设计一个算法,输出图G中经过某个顶点vi的长度为L的所有环。
【正确答案】所谓环是指路径上的顶点不重复,但第一个顶点与最后一个顶点重复的回路。本题利用回溯深度优先搜索算法,在递归调用时不仅要考虑未访问过的邻接顶点,还要将当前结点为vi的顶点强制递归调用,否则无法判断回路。 由此可以写出如下程序代码: int visited[Vnum],A[Vnum]; void dfs1(graph *g,int vi,int vj,int L,int d) { int v,i; arcnode *p; visited[vi]=1; ++d; A[d]=vi; if(vi==vj && d==L) { cout<<"一条路径: "; for(i=0;i<=d; ++i) cout<<A[i]<<" "; cout<<endl; } p=g→adjlist[vi].firstarc; //找vi的第一个邻接顶点 while(p!=NULL) { v=p→adjvex; //v为vi的邻接顶点 if(visited[v]==0 || v==vj) //若该顶点未标记访问,或为vj,则递归访问 dfs1(g,v,vj,l,d); p=p→nextarc; //找vi的下一个邻接顶点 } visited[vi]=0; //擦除访问标记,以使该顶点可重新使用 --d; } void cycle(graph *g,int vi,int L,int d) { dfs1(g,vi,vi,L,d); }
【答案解析】