最大数量可以从图中的给定源访问的节点数

时间:2015-06-17 08:51:27

标签: graph depth-first-search

我有一个有向图,其中每个节点只有一个边到另一个节点。我必须找到可以达到最大节点数的节点。

我尝试使用dfs执行此操作,并将信息存储在数组sum[]中,但我遇到了分段错误。 该图表表示为pair< int, int >的邻接列表。首先是目的地,其次是重量。在这个问题中weight = 0

我的dfs实现:

int sum[V];   // declared globally, initially set to 0
bool visited[V];   // declared globally, initially set to false

int dfs( int s ){

    visited[s]= true;

    int t= 0;

    for( int i= 0; i< AdjList.size(); ++i ){

        pii v= AdjList[s][i];

        if( visited[v.first] )
            return sum[v.first];

        t+= 1 + dfs( v.first );
    }

    return sum[s]= t;
}

内部main()

int maxi= -1;    // maximum no. of nodes that can be reached

for( int i= 1; i<= V; ++i ){   // V is total no. of Vertices

    int cc;

    if( !visited[i] )
        cc= g.dfs( i ) ;

    if( cc > maxi ){
        maxi= cc;
        v= i;
    }
}

图表是:

1 2    /* 1---->2 */
2 1    /* 2---->1 */
5 3    /* 5---->3 */
3 4    /* 3---->4 */
4 5    /* 4---->5 */

我的dfs实施中有什么问题?

1 个答案:

答案 0 :(得分:0)

当你找到任何已经到达的节点时退出你的dfs,但我知道你应该在所有adjectent节点上运行:在dfs函数中更改if循环内的for语句:

代替:

if(visited[v.first] )
  return sum[v.first];

t+= 1 + dfs( v.first );
if(!visited[v.first] ) {
  t+= dfs( v.first );
}

并用1(不是0)初始化t。这样您就可以找到连接组件的大小。因为您对开始的节点不感兴趣,所以必须将最终结果减少一个。

我做了另外一个假设:你的图表是无向的。如果它是定向的,那么如果你只想解决问题(而不是复杂性),那么在主函数中完成单次运行dfs后,只需清除visitedsum数组。

修改

代码中还有一个错误。变化:

for( int i= 0; i< AdjList.size(); ++i ){

成:

for( int i= 0; i< AdjList[s].size(); ++i ){

您应该能够自己跟踪段错误。使用gdb它是非常有用的工具。