1

とても簡単な質問があります。

ノードとエッジを持つ小さなグラフを作成するために、Java で隣接行列 (2D 配列) を使用しています。

私の問題は、単純なネストされたループを使用して隣接行列を反復処理するようにプログラムに指示すると、エッジのオーバーラップの問題が発生することです。より具体的には、matrix[i][j] が true であり、matrix[j][i] が true の場合、アプリはノード i と j の間に 2 つのエッジを描画しようとしますが、無駄で見栄えが悪くなります。

どうすればその問題を克服できますか?

4

3 に答える 3

4

マトリックス全体を反復処理しないでください。三角形の上半分 (または下半分) を使用すると、関心のあるすべてのエントリがカバーされます。

行列が対角対称であると仮定すると、どちらか半分で十分です。対称でない場合は、有向グラフ (エッジには矢印があります) を使用しており、それらの重複したエッジを保持する必要があります。

三角形の半分を反復する簡単な方法は、次のようなネストされたループです。

for(i=0;i<n;i++){
  for(j=i;j<m;j++){
   whatever(i,j);
  }
 }

j=i の開始は、列の反復が対角線から開始し、重複部分をスキップすることを意味します。

于 2010-11-25T02:17:10.823 に答える
2

行列の半分を通過するだけです(つまり、主対角線の下)

のようなことをする

for(i=1; i<= size; i++)
  for(j=i+1; j<= size; j++) 
     // draw
于 2010-11-25T02:17:38.180 に答える
1

これは無向グラフのように聞こえます。その場合、行列の上半分 (対角線の上) だけに実際にデータが含まれています。このような場合は:

int[][] foo = //...

for(int i = 0; i < foo.length; i++){
    for(int j = i; j < foo[j].length; j++){
        // ...
    }
}

この反復を使用すると、行列の半分だけを反復するだけなので、重複したエッジを持つことは不可能であることに注意してください。

于 2010-11-25T02:15:31.807 に答える