DFS找到所有可能的路径 - 我哪里出错了?

时间:2015-10-14 14:39:37

标签: c graph-traversal

我需要实现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);
                }
            }
        }
    }
}

实施例: 如果我有一个无向图

  • 节点1连接到2,4
  • 节点2连接到1,4,3
  • 节点3连接到2,5,6
  • 节点4连接到1,2,5
  • 节点5连接到4,3,6
  • 节点6连接到3,5

使用此代码,如果item = 2,那么我应该

  • 2-1-4-5-6-3
  • 2-1
  • 2-1-4
  • 2-2-1-5-6-3

等等。

但我得到了

  • 2
  • 1
  • 1-4
  • 1-4-5
  • 1-4
  • 1-4-3
  • 1

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);
                }
            }
        }
    }
}

不知道,我相信pushpop能够与itemtop正确合作,并且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感知能力:)