阅读和维护C ++中的图形

时间:2012-04-09 21:33:54

标签: c++ algorithm data-structures graph

我有一个文本文件,我将从中读取无向图。格式如下:

1 2 3
2 1
3 1

其中行中的每个第一个元素都对应一个顶点,其余的基本上是顶点的邻接列表。

所以我的两个问题是:

  • 1)在C ++中阅读此信息的最佳方法是什么? 通过以下代码段,我可以连续地阅读所有信息,但当然这不是我想要达到的目标。我希望能够以一种体面的方式分离不同行的信息。(这部分实际上与我的第二个问题密切相关,如下所示)

    void inputHandle(ifstream& f, int arr[], string fileName)
    {
    
        f.open(fileName);
    
        if (!f) {
            cout << "Unable to open file";
            exit(1); // terminate with error
        }
    
        string temp;
        int i = 0, numTemp;
    
        while(f >> temp){
            numTemp= atoi(temp.c_str());
            arr[i] = numTemp;
            cout<<arr[i];
            i++;
        }
    
        f.close();
    }
    
  • 2)保留此图表的最佳数据结构是什么? 我将实现一个mincut算法,因此我将在每次迭代时修改图形(删除/修改行)。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我会将图形存储为adjacency listmatrix,在C ++中,这是一种编码方式。根据性能/存储要求,您可能需要调整它。

vector< list<int> > graph;

或者您可以使用adjaceny矩阵。

vector< vector<bool> > graph;

至于阅读文件格式,我会使用getline()逐行读取文件,然后解析每一行的整数值(可能是istringstream),这可能是这样的:< / p>

ifstream f;

vector< list<int> > graph;

f.open(fileName);
while(!f.eof() && !f.fail())
{
    char line[1024]; // Reserve enough space for longest line
    f.getline(line, 1024);

    istringstream iss(line, istringstream::in);

    int vertex;
    iss >> vertex;
    if(!f.fail())
    {
        if(vertex > graph.size()) // Max number of vertex is unknown
        {
            graph.resize(vertex); 
        }
        vertex--; // From your 1-base to zero-based
        list<int>& vertex_list = graph[vertex];
        do
        {
            int to_vertex;
            iss >> to_vertex;
            if(!iss.fail())
            {
               vertex_list.push_back(to_vertex - 1);
            }
        } while(!iss.eof() && !iss.fail());
    }
}