我有一个名为boolean[][]
的{{1}} 2D数组,它对有向图进行编码,如果matrix
,则顶点 j 连接到顶点< em> i (反之不一定是真的)
我正在尝试创建一个Java方法来确定我有多少不相交的有向图。
因此对于示例,如果顶点0连接到顶点1,并且顶点2连接到顶点3
matrix[i][j] == true
,我会有2个不相交的有向图。
如果没有连接,不相交有向图的数量将等于顶点的数量。
答案 0 :(得分:1)
从树中所有节点的列表开始。请考虑这些未经访问的节点。
然后重复以下过程,直到您的未访问节点列表消失。
此过程完成后,您的节点集对应于每个不相交图中唯一存在的节点,因此节点集的数量就是您寻找的值。
答案 1 :(得分:1)
您似乎不需要强大的连接,因此disjoint-set forests非常有效的算法可以完成这项工作。在联合阶段之后,您只需要使用parent = self
计算节点答案 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();
}