我想检查一个图是否完全连接 - 即每个节点是否连接到每个其他节点。
我从图形文件中获取输入并将其放在二维数组中。完全连接的2D阵列的示例如下所示:
{{0, 1, 1, 1, 1}
{1, 0, 1, 1, 1}
{1, 1, 0, 1, 0}
{1, 1, 1, 0, 1}
{1, 1, 1, 1, 0}}
如何编写一个布尔方法来检查它是否完全连接?我有点失去了想法,所以任何提示,建议和帮助都非常受欢迎。
答案 0 :(得分:2)
一种似是而非(但很慢)的方法是对自身进行矩阵乘法k次,其中k是节点数(在你的例子中k = 5)。也就是说,假设您的示例中的矩阵为A,则执行A = A x A 5次。之后,您可以简单地检查任何一行 - 如果该行都是非零,则图表完全连接。有关详细信息,请参阅this link。
答案 1 :(得分:1)
首先,你的2d数组中的图形意味着有向图,因为(5和3)与边连接但(3和5)不连接。出于同样的原因,它没有完全连接。
检查完整连接的Java代码:
public boolean checkFullConn( int[][] grid ) {
boolean fully = true;
for (int i = 1; i <= 5; i++)
for (int j = 1; j <= 5; i++)
if (i<>j)
if (grid[i,j]==0)
fully = false;
return fully;
}
要检查简单连接(未完整),以下Java代码基本上检查所有其他节点最终是否连接到node1。
public boolean checkConn( int[][] grid ) {
boolean conn1[5];
for (int i = 1; i <= 5; i++)
conn1[i] = false;
conn1[1] = true;
for (int k = 1; k <= 5; k++)
for (int i = 1; i <= 5; i++)
if conn1[i]
for (int j = 1; j <= 5; i++)
if (grid[i,j]==1) || grid(j,i))
conn1[j] = true;
boolean conn = true;
for (int i = 2; i <= 5; i++)
conn = conn && conn1[i];
return conn;
}
答案 2 :(得分:1)
基本上,如果只有主对角线包含零,则有向图的矩阵表示是完全连接的,因为主对角线表示每个顶点与其自身的连接。
与此不同的任何东西代表一个未完全连接的图形。所以,以一种非常简单的方式:
boolean isFullyConnected(int[][]m)
for (int i = 0; i < m.length; i++) //iterate over rows
for (int j = 0; j < m[i].length; j++) //iterate over columns
if(i != j && m[i][j] == 0) //if not in main diag. and not connected
return false;
return true;
}
如果没有定向(如果只有一个方向有链接,你可以说顶点连接到另一个顶点),你可以改变算法,只需添加反向条件&& m[j][i] == 0
:
boolean verify(int[][]m){
for (int i = 0; i < m.length; i++)
for (int j = 0; j < m[i].length; j++)
if(i != j && m[i][j] == 0 && m[j][i] == 0) //there's the difference
return false;
return true;
}
这是因为,想象通过主对角线的线折叠矩阵,索引的每个重叠将表示两个方向上的两个顶点之间的连接,并且您只需要一个。