【正确答案】所谓环是指路径上的顶点不重复,但第一个顶点与最后一个顶点重复的回路。本题利用回溯深度优先搜索算法,在递归调用时不仅要考虑未访问过的邻接顶点,还要将当前结点为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);
}
【答案解析】