[英]Check if graph is fully connected - java
我想检查图是否已完全连接-即每个节点是否都彼此连接。
我从图形文件中获取输入并将其放置在二维数组中。 完全连接的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}}
我如何编写一个布尔方法来检查它是否完全连接? 我有点想法不清,因此任何提示,建议和帮助都非常欢迎。
一种可行(但较慢)的方法是对自身进行矩阵乘法k次,其中k是节点数(在您的示例中k = 5)。 也就是说,假设您的示例中的矩阵为A,然后将A = A x A进行5次。 然后,您可以简单地检查任何一行是否-如果该行都是非零的,则该图已完全连接。 请参考此链接以获取更多信息。
首先,在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;
}
基本上,如果仅主对角线包含零,则有向图的矩阵表示完全连接,因为主对角线表示每个顶点与其自身的连接。
与此不同的地方表示未完全连接的图。 因此,以非常非常简单的方式:
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;
}
这是因为,想象一下用主对角线折叠矩阵,索引的每个重叠将代表两个顶点在两个方向上的连接,而您只需要一个即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.