2012-04-09 12 views
1

私は無向グラフを読む場所からのテキストファイルを持っています。C++でグラフを読み込み、維持しています

1 2 3 
2 1 
3 1 

の行のすべての最初の要素が頂点に対応し、残りは基本的に頂点のための隣接リストである場合、次のようなフォーマットです。

だから私の二つの質問は次のとおりです。

  • 1)C++でこの情報を読むための最良の方法は何ですか? 次のコードセグメントでは、私はすべての情報を正確に読むことができますが、もちろんそれは私が最終的に達成したいものではありません。私はまともな方法で、異なる行の情報を分離することができるようにしたい。(下図のように、この部分は実際に密接に、私の2番目の質問に関連している)最高のデータ構造であるもの

    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)このグラフを保存するには? 私はミニカットアルゴリズムを実装していますので、各繰り返し(グラフの削除/変更)でグラフを修正します。

ご協力いただきありがとうございます。

+0

私は(かつては)その複雑さによって落胆していましたが、Boost Graph Libraryは[最小カット実装]を提供しています(http://www.boost.org/doc/libs/1_46_1/libs/graph/doc/ stoer_wagner_min_cut.html)。 – eudoxos

答えて

2

私はadjacency listまたはmatrixのいずれかのグラフをC++で保存します。ここではこれをコーディングする方法の1つです。パフォーマンス/ストレージの要件によっては、これを調整する必要があるかもしれません。

vector< list<int> > graph; 

またはadjacenyマトリックスを使用できます。お使いのファイル形式を読み取るためとして

vector< vector<bool> > graph; 

、私は(おそらくistringstreamで)行毎にファイルを読み込むと、整数値のそれぞれの行を解析するgetline()を使用することになり、おそらくこのような何か:

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()); 
    } 
} 
関連する問題