Java中的邻接矩阵 - 边缘重叠

时间:2010-11-25 01:18:04

标签: java adjacency-matrix

我有一个非常简单的问题要问。

我在java中使用邻接矩阵(2D数组)来创建一个带有节点和边的小图。

我的问题是,当我指示程序迭代邻接矩阵时, 使用一个简单的嵌套循环,我遇到边缘重叠的问题。 更具体地说,当矩阵[i] [j]为真且矩阵[j] [i]为真时,应用程序将尝试在节点i和j之间绘制2条边,这将是浪费和丑陋的外观。

我如何克服这个问题?

3 个答案:

答案 0 :(得分:4)

不要遍历整个矩阵,你可以使用上半角(或下半部分),这将涵盖你感兴趣的所有条目。

假设矩阵是对角对称的,那么任何一半都足够了。如果它不是对称的,那么你使用有向图(边有箭头),你会想要保留那些重复的边。

迭代三角形一半的简单方法是这种嵌套循环:

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

启动j = i表示柱状迭代从对角线开始并跳过重复的部分。

答案 1 :(得分:2)

只需通过矩阵的一半(即主对角线下方)

做类似

的事情
for(i=1; i<= size; i++)
  for(j=i+1; j<= size; j++) 
     // draw

答案 2 :(得分:1)

听起来这是一个无向图,在这种情况下,只有矩阵的上半部分(在对角线上方)确实包含任何数据。如果是这种情况:

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

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

请注意,使用此迭代时,不可能有重复的边缘,因为我们只遍历矩阵的一半。