【问题标题】:In an adjacency matrix, how to find a given vertex's neighbor's neighbors?在邻接矩阵中,如何找到给定顶点的邻居?
【发布时间】:2017-01-12 03:37:00
【问题描述】:
假设我们有一个这样的 4x4 邻接矩阵:
还有一个给定的顶点,比如说int v=1
如何找到顶点 1 的邻居的邻居,并将它们添加到列表中?例如,如果我想从顶点 1 到顶点 4,我必须先到顶点 2,然后从顶点 2 到顶点 4,因为从 1 到 4 没有直接路径。我想添加顶点 4 和类似于列表。
现在这是我得到的:
int v=1;
for(int i=0;i<adjmat.length;i++){
if (i==v){
for(int j=0;j<adjmat[i].length;j++){
if (j!=i){ // self loops do not count
// if adjmat[i][j] has a neighbor, add the neighbor to a list
}
}
}
}
【问题讨论】:
标签:
algorithm
matrix
graph
【解决方案1】:
你所拥有的似乎是正确的。
只是一些注意事项:
当您的循环从 0 开始时,您的图形的索引从 1 开始。您可能并不担心这一点,但无论如何,让我们假设顶点以 1 开头,并且您的数组以 0 开头。
那么唯一真正关心的是你最外层的循环。如果你只需要找到一个顶点v的邻居的邻居(你的例子,v = 1)
int v_i = v-1;
for(int j=0;j<adjmat[v_i].length;j++){
if (v_i!=j){ // self loops do not count
// if adjmat[i][j] has a neighbor, add the neighbor to a list
//*NOTE maybe only if that neighbor is also not a self loop, one of v's first neighbors, or v
}
}
【解决方案2】:
如果 A 是邻接矩阵,考虑 A^2 由矩阵乘法构造,内积为 AND 并与 OR 求和。成员的价值
A^2(i,j) = OR(k){ A(i,k) AND A(k,j) }
这表示i 连接到j,如果存在k 使得i 连接到k 并且k 连接到j。所以这个矩阵就是原图中每一对可以被两条边连接的顶点连接起来的图。