检查图形是否完全连接 - java

时间:2015-11-03 19:07:40

标签: java arrays graph

我想检查一个图是否完全连接 - 即每个节点是否连接到每个其他节点。

我从图形文件中获取输入并将其放在二维数组中。完全连接的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}}

如何编写一个布尔方法来检查它是否完全连接?我有点失去了想法,所以任何提示,建议和帮助都非常受欢迎。

3 个答案:

答案 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;
}

这是因为,想象通过主对角线的线折叠矩阵,索引的每个重叠将表示两个方向上的两个顶点之间的连接,并且您只需要一个。