我有一个非常简单的问题要问。
我在java中使用邻接矩阵(2D数组)来创建一个带有节点和边的小图。
我的问题是,当我指示程序迭代邻接矩阵时, 使用一个简单的嵌套循环,我遇到边缘重叠的问题。 更具体地说,当矩阵[i] [j]为真且矩阵[j] [i]为真时,应用程序将尝试在节点i和j之间绘制2条边,这将是浪费和丑陋的外观。
我如何克服这个问题?
答案 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++){
// ...
}
}
请注意,使用此迭代时,不可能有重复的边缘,因为我们只遍历矩阵的一半。