我正在编写一个程序来查找给定图表的"强连接组件" 。
为此,我使用以下算法
1)应用DFS并按堆栈中的完成时间的降序推送节点
2)转置图形。 (反转图形的边缘)
3)弹出节点并再次应用DFS。
如果我按功能 addEdge(int u,int v)接受图形边缘(从节点u到节点v的边缘)。
程序正常工作。
问题:但是当我尝试通过输入文件接受图形时,它给了我错误
我没有给整个程序,因为它正常工作。
class Graph
{
int V;
list<int> *adj;
void fillorder( int v , bool visited[] , stack<int> &stack);
void DFSUtil(int v , bool visited[]);
public:
Graph( int V);
void printSCCs();
Graph get_Transpose();
void print_graph();
void read_input_file();
};
Graph:: Graph(int V)
{
this-> V = V;
adj = new list<int>[V];
}
void Graph :: read_input_file()
{
const long int N = 100;
std::ifstream infile("S.txt");
std::string line;
int i = 0;
while ( i < N && getline(infile, line) )
{
std::istringstream str(line);
int u;
str >> u;
if ( u > N )
{
// Problem.
abort();
}
int v;
while ( str >> v )
{
adj[u-1].push_back(v);
}
++i;
}
}
void Graph :: print_graph()
{
for( int i = 0 ; i < 9 ; i++ )
{
list<int> :: iterator itr;
for( itr = adj[i].begin(); itr != adj[i].end(); ++itr )
{
cout<< i+1 <<" --> " << *itr <<endl;
}
}
}
void Graph:: printSCCs()
{
stack<int>Stack;
bool *visited = new bool[V];
for( int i = 0 ; i < V ; i++ )
visited[i] = false;
for( int i = 0 ; i < V ; i++ )
if(visited[i] == false)
fillorder(i , visited , Stack);
Graph gr = get_Transpose();
for( int i = 0 ; i < V ; i++ )
visited[i] = false;
while( Stack.empty() == false)
{
int no = Stack.top();
Stack.pop();
if(visited[no] == false)
{
gr.DFSUtil(no , visited);
cout<< endl;
}
}
}
int main()
{
Graph g(9);
g.read_file(); // Working perfectly
g.print_graph(); // showing graph perfectly
g.printSCCs(); // Giving error : Segmentation fault: core dump
return 0;
}
图表正确打印但g.printSCCs()
无效。
Error is : Segmentation fault: core dump
Now if g.print_graph() is working perfectly then why not g.printSCCs() ?
注意:我没有粘贴整个程序只是为了确保它是可读的 此外,通过手动输入边缘,整个程序完美地工作,所以我认为任何函数都不会出错。
I / P文件数据:
1 4
2 8
3 6
4 7
5 2
6 9
7 1
8 5
8 6
9 7
9 3