我有一个有向图,其中每个节点只有一个边到另一个节点。我必须找到可以达到最大节点数的节点。
我尝试使用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实施中有什么问题?
答案 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后,只需清除visited
和sum
数组。
修改强>
代码中还有一个错误。变化:
for( int i= 0; i< AdjList.size(); ++i ){
成:
for( int i= 0; i< AdjList[s].size(); ++i ){
您应该能够自己跟踪段错误。使用gdb它是非常有用的工具。