使用Boost Graph编写图形的连通分量

时间:2010-06-01 10:58:32

标签: c++ boost graph

我有一个文件是一长串加权边,列表如下

node1_id node2_id weight
node1_id node3_id weight

等等。所以每行一个加权边。

我想将此文件加载到boost图中,并在图中找到连接的组件。每个连接的组件都是子图。对于这些组件子图中的每一个,我想写一个包含上述格式边的文件。我想用升压图来做所有这些。

这个问题原则上很简单,只是我不确定如何巧妙地实现它,因为我不了解Boost Graph的方法。我已经花了几个小时并且有代码可以找到连接的组件,但是我的版本肯定要长得多,而且更复杂 - 我希望有一个提升图形的忍者可以告诉我正确的,简单的方法。

因为它是被请求的,所以这是我到目前为止的代码。我不认为我在这里以最有效或最优雅的方式使用boost,并且这个解决方案并不完整(我不会将子图打印出来并将每个边缘打印成单独的文件)。     #包括     #包括     #包括     #包括     #包括     #include

using namespace std;

typedef adjacency_list <vecS,
                        vecS,
                        undirectedS,
                        property<edge_weight_t float>
                        > AdjListGraph;

void writeConnectedComponents(char *filename)
{
  AdjListGraph G;
  ifstream inputFile;
  inputFile.open(filename);  
  unsigned int id1, id2;
  float weight;
  string lineread;
  stringstream ss;
  while(getline(inputFile, lineread))
    {
      ss.clear();
      ss.str("");
      ss << lineread;
      ss >> id1;
      ss >> id2;
      ss >> weight;
      add_edge(id1, id2, weight, G);
    }
  /* Following vector contains the component number of each node */
  vector<int> components(num_vertices(G));

1 个答案:

答案 0 :(得分:3)

我使用Boost.Graph来构建Gnocchi

学习曲线非常陡峭。我认为在这个图书馆获取这本书至关重要。帮助我了解该库的是实际修改它以使其按照我的意愿行事。后来我发现了如何正确使用它。我只触及了图书馆的一小部分,但他们做事的方式非常有趣。还有Python的绑定,所以我认为花一些时间学习它是值得的。