图的深度遍历问题!
intvisited[VEX_NUM]={0};voidDFSTraverseM(MGraph*G,inti)/*从i结点开始深度优先遍历以邻接矩阵存储的图G*/{pri...
int visited[VEX_NUM]={0};
void DFSTraverseM(MGraph *G,int i)
/*从i结点开始深度优先遍历以邻接矩阵存储的图G*/
{ printf("%c",G->vexs[i]);
visited[i]=1; /*标志向量初始化*/
for (j=0;i<G->n;j++)
if ((G->adj[i][j]==1)&&(!visited[j]))
DFSTraverseM(G,j);
/*vj未访问,从vj开始DFS搜索*/
}/*DFSTraveseM*/
请问这个对吗?
尤其是for(j=0;i<G->n;j++)这 总感觉是死循环 大神解释下 详细点 展开
void DFSTraverseM(MGraph *G,int i)
/*从i结点开始深度优先遍历以邻接矩阵存储的图G*/
{ printf("%c",G->vexs[i]);
visited[i]=1; /*标志向量初始化*/
for (j=0;i<G->n;j++)
if ((G->adj[i][j]==1)&&(!visited[j]))
DFSTraverseM(G,j);
/*vj未访问,从vj开始DFS搜索*/
}/*DFSTraveseM*/
请问这个对吗?
尤其是for(j=0;i<G->n;j++)这 总感觉是死循环 大神解释下 详细点 展开
3个回答
展开全部
G->n就是G这个图的定点数
for (j=0;i<G->n;j++) 这句是用来检查图中的每个顶点,j就是顶点的编号
if ((G->adj[i][j]==1)&&(!visited[j])) 这句是检查如果编号为i的点和编号为j的点之间有边并且点j没有被访问过
DFSTraverseM(G,j);那么就从j点继续遍历下去
for (j=0;i<G->n;j++) 这句是用来检查图中的每个顶点,j就是顶点的编号
if ((G->adj[i][j]==1)&&(!visited[j])) 这句是检查如果编号为i的点和编号为j的点之间有边并且点j没有被访问过
DFSTraverseM(G,j);那么就从j点继续遍历下去
追问
那个i怎么变啊 怎么达到递归结束的条件??
追答
void DFSTraverseM(MGraph *G,int i)
i是调用函数时输入的参数
能往下递归的只有这一句
if ((G->adj[i][j]==1)&&(!visited[j]))
DFSTraverseM(G,j);
那么if里面的条件不成立时,递归就结束了
代码里面的意思就是,如果现在这个点,跟任何其他点之间都没有边,或者跟它有边的都被访问过了,就不往下递归了
展开全部
for (j=0;i<G->n;j
if ((G->adj[i][j]==1)&&(!visited[j]))
DFSTraverseM(G,j);
++)//这不是死循环吧,i不是一直在变的吗,也就是当i的大小等于结点的个数时,就会终止循环的,其实这个循环就是访问一个一个节点的所有相邻结点,如果相邻结点未访问,则将相邻结点作为新的根节点重新进行DFS。
if ((G->adj[i][j]==1)&&(!visited[j]))
DFSTraverseM(G,j);
++)//这不是死循环吧,i不是一直在变的吗,也就是当i的大小等于结点的个数时,就会终止循环的,其实这个循环就是访问一个一个节点的所有相邻结点,如果相邻结点未访问,则将相邻结点作为新的根节点重新进行DFS。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-09-27
展开全部
条件i<G->n 是遍历所有结点,怎么会是死循环呢。深度优先遍历是从一个点出发,优先遍历更远的结点,直到没有为止,再返回重复遍历。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询