计算不相交的有向图

时间:2012-05-22 02:19:03

标签: java arrays math directed-graph

我有一个名为boolean[][]的{​​{1}} 2D数组,它对有向图进行编码,如果matrix,则顶点 j 连接到顶点< em> i (反之不一定是真的) 我正在尝试创建一个Java方法来确定我有多少不相交的有向图。

因此对于示例,如果顶点0连接到顶点1,并且顶点2连接到顶点3 matrix[i][j] == true,我会有2个不相交的有向图。

如果没有连接,不相交有向图的数量将等于顶点的数量。

3 个答案:

答案 0 :(得分:1)

从树中所有节点的列表开始。请考虑这些未经访问的节点。

然后重复以下过程,直到您的未访问节点列表消失。

  1. 创建一个空集“node-set”,以表示当前节点图中的节点。
  2. 从当前节点开始执行搜索。对于您在搜索中遇到的每个节点,将其从未访问的节点列表中删除,然后:(1)如果该节点已存在于另一个节点集中,则合并当前节点集和该其他节点集并停止搜索该节点,或(2)如果该节点已存在于当前节点集中,则停止从该节点搜索,或者(3)如果您从未见过该节点,则将其添加到当前节点集。
  3. 此过程完成后,您的节点集对应于每个不相交图中唯一存在的节点,因此节点集的数量就是您寻找的值。

答案 1 :(得分:1)

您似乎不需要强大的连接,因此disjoint-set forests非常有效的算法可以完成这项工作。在联合阶段之后,您只需要使用parent = self

计算节点

P.S。 Sedgewick lection about it

答案 2 :(得分:1)

public int countDisjointSubgraphs() {
    int len = matrix.length;
    int[] nodes = new int[len];
    for (int i = 0 ; i < len ; i++) nodes[i] = i;
    for (int i = 0 ; i < len ; i++) {
        for (int j = 0 ; j < len ; j++) {
            if (matrix[i][j] || matrix[j][i])
                for (int k = 0 ; k < len ; k++)
                    if (nodes[k] == nodes[i]) nodes[k] = j;
        }
    }
    ArrayList<Integer> list = new ArrayList<Integer>();
    for (int i : nodes)
        if (list.indexOf(i) < 0) list.add(i);
    return list.size();
}