所以我需要检查一个矩阵是否有一个根节点,或者它是否甚至是一棵树。 我这样做的方法就是检查是否只有一个节点的indegreee为0且所有其他节点都需要为1。我已经这样做了,但是我的代码没有检查是否有任何循环。我不知道如何检查是否有任何循环,因为如果有,这意味着矩阵不是树。
所以,如果你要绘制一个矩阵的图形,你会得到这样的东西。
矩阵即时测试是:
0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
0 0 1 0 0 1 0 0 0
0 1 0 0 0 0 1 0 1
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
以下是在一个名为matrixWork
的单独文件中运行它的代码public int rootnode(){
// Root node number (if any) of current matrix
for(int i = 0; i < SIZE-1; i++){
if(indegree(i) == 0){
for(int j = i; j < SIZE-1; j++){
if(indegree(i) == 0 && indegree(j) !=0){
return i;
}
}
}
else if(indegree(i) > 1)
return -1;
}
//in case they are all 1s
return -1;
}
public int indegree(int K){
// Number of arrows INTO node K of digraph
// Nodes are numbered 0,1,2,...,SIZE-1
int colsum = 0;
for(int r = 0; r < SIZE; r++)
colsum = colsum + M[r][K];
return colsum;
}
这是主要的课程
public class MatrixWork{
// Instance variables
public int M[][];
public int SIZE;
// Boolean matrix constructors
public MatrixWork(int s){
SIZE = s;
M = new int[SIZE][SIZE];
// Fill M with zeros
for(int r = 0; r < SIZE; r++){
for(int c = 0; c < SIZE; c++){
M[r][c] = 0;
}
}
}
public MatrixWork(int[][] B){
SIZE = B.length;
M = new int[SIZE][SIZE];
// Copy matrix B values into M
for(int r = 0; r < SIZE; r++){
for(int c = 0; c < SIZE; c++){
if(B[r][c] == 0)
M[r][c] = 0;
else
M[r][c] = 1;
}
}
}
public static void main(String[] args)
{
int A[][] = new int[][]
{{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 1, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 1, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}};
MatrixWork MA = new MatrixWork(A);
}
}
答案 0 :(得分:0)
对于将来寻找这类问题答案的人。我能够对矩阵本身进行传递闭包。如果对角线中的任何数字为1,则表示存在循环,因此这不是树。 希望这有助于其他任何人。