我需要实现DFS以从顶点找到所有可能的路径,比如" item"
到目前为止,我有以下内容,我无法理解我哪里出错了。
void dfs()
{
int i;
for(i=1;i<=nodecount;i++)
{
visited[i]=0;
}
push(item);
while(top!=0)
{
pop();
visited[item]=1;
for(i=1;i<nodecount;i++)
{
if(topo[item][i]==1)
{
if(visited[i]==0)
{
item=i;
visited[i]=1;
push(item);
}
}
}
}
}
实施例: 如果我有一个无向图
使用此代码,如果item = 2,那么我应该
等等。
但我得到了
答案 0 :(得分:0)
我认为你item
时不应该覆盖(中断)visited[i]==0
。
此外,范围在初始化和DFS方面有所不同。
还有一些更正。
void dfs()
{
int i;
for(i=1;i<=nodecount;i++)
{
visited[i]=0;
}
visited[item]=1; /* add this to mark the start point as visited */
push(item);
while(top!=0)
{
pop();
/* delete visited[item]=1; here */
for(i=1;i<=nodecount;i++) /* changed < to <= */
{
if(topo[item][i]==1)
{
if(visited[i]==0)
{
visited[i]=1; /* item is unchanged unless push change it */
push(i);
}
}
}
}
}
不知道,我相信push
和pop
能够与item
和top
正确合作,并且visited
中有足够的元素。< / p>
如果push
假定item
将作为参数传递,请尝试以下方式:
void dfs()
{
int i;
for(i=1;i<=nodecount;i++)
{
visited[i]=0;
}
visited[item]=1; /* add this to mark the start point as visited */
push(item);
while(top!=0)
{
pop();
/* delete visited[item]=1; here */
for(i=1;i<=nodecount;i++) /* changed < to <= */
{
if(topo[item][i]==1)
{
if(visited[i]==0)
{
int item_bak = item;
item = i;
visited[item]=1;
push(item);
item = item_bak;
}
}
}
}
}
答案 1 :(得分:0)
那个递归函数怎么样?
void dfs(int item) {
int i;
push(item);
visited[item] = 1;
pstack();
for(i=1; i<nodecount; i++) {
if ((nodes[item][i] == 1) && (visited[i] == 0)) {
dfs(i);
visited[i] = 0;
}
}
pop();
}
这里pstack()是一个打印堆栈内容的函数,必须使用visit [] inited为0调用此函数。 使用与我相同的格子:
. 2
. 2 1
. 2 1 4
. 2 1 4 5
. 2 1 4 5 3
. 2 3
. 2 3 5
. 2 3 5 4
. 2 3 5 4 1
. 2 4
. 2 4 1
. 2 4 5
. 2 4 5 3
我将'item'作为函数的参数。注意:起始计数为1并不真正具有C感知能力:)