2016-10-24 8 views
-1

C++で最大スパニングツリーを作成しようとしていますが、サイクルを防ぐのに問題があります。私が使っているコードは、いくつかのケースで問題なく動作しますが、大半のケースではサイクルがあります。私はエッジを見つけるために隣接行列を使用しています。私はサイクルを見つけることを試みてきました最大スパニングツリーのサイクルを防止する

double maximumST(vector< vector<double> > adjacencyMatrix) { 

    const int size = adjacencyMatrix.size(); 
    vector <double> edges; 
    int edgeCount = 0; 
    double value = 0; 
    std::vector<std::vector<int>> matrix(size, std::vector<int>(size)); 

    for (int i = 0; i < size; i++) { 
     for (int j = i; j < size; j++) { 
      if (adjacencyMatrix[i][j] != 0) { 
       edges.push_back(adjacencyMatrix[i][j]); 
       matrix[i][j] = adjacencyMatrix[i][j]; 
       edgeCount++; 
      } 
     } 
    } 

    sort(edges.begin(), edges.end(), std::greater<int>()); 

    for (int i = 0; i < (size - 1); i++) { 
     value += edges[i]; 
    } 

    return value; 

} 

一つは、エッジのための新たな隣接行列を作成し、新しいエッジを追加する前にそれを確認することであったが、予想通り、それは実行されませんでした。私は3Dマトリクスを構築しようとしましたが、それを動作させることができませんでした。

サイクルを防止するための新しいアプローチは何ですか?

+1

申し訳ありませんが、あなたのアプローチはよく分かりません。これはどのように動作するはずですか?現時点では、隣接行列にあるすべてのエッジを単純に押しています。すでに到達した頂点を何らかの形で覚えておく必要があります。そのためにコードには何もありません。 – BeyelerStudios

答えて

0

エッジに対応する2つの頂点の最小共通祖先(LCA)がルートでない場合は、エッジを追加する必要があります。

関連する問題