检查矩阵在java中是否有根节点

时间:2014-03-07 15:50:39

标签: java matrix root

所以我需要检查一个矩阵是否有一个根节点,或者它是否甚至是一棵树。 我这样做的方法就是检查是否只有一个节点的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);
    }
}

1 个答案:

答案 0 :(得分:0)

对于将来寻找这类问题答案的人。我能够对矩阵本身进行传递闭包。如果对角线中的任何数字为1,则表示存在循环,因此这不是树。 希望这有助于其他任何人。