Асимметрия подразумевает, что для каждого i, j, где i! = J, M (i, j) == 0 или M (j, i) == 0.
Ваше текущее состояние:
if((graph.getEdge(i, j) == graph.getEdge(j, i)) && (i == j))
Из-за i == j
в вашем состоянии вы проверяете диагональ по центру матрицы. Это означает, что getEdge(i, j) == getEdge(i, i) == getEdge(j, j) == getEdge(j, i)
, поскольку i == j
. Таким образом, ваша проверка будет всегда проходить, поскольку вы сравниваете матричную запись с самим собой.
Попробуйте реализовать условие, указанное в предоставленном вами определении, которое в основном гласит, что одно из двух должно быть 0
:
if((graph.getEdge(i, j) == 0 || graph.getEdge(j, i) == 0) && (i != j))
Однако ваша логика выхода из цикла также несовершенна, поскольку вы вернете true, если первая пара удовлетворяет этому условию, а не всей матрице. Попробуйте проверить на наличие сбоев и выйти рано, иначе, если вы пройдете через матрицу без сбоев, вы знаете, что условие было успешным для каждой пары, и матрица асимметрична:
// AntiSymmetric
public static boolean checkAntisymmetric(Graph graph, int vertices){
for(int i = 1; i <= vertices; i++) {
for(int j = 1; j <= vertices; j++){
if((i != j) && graph.getEdge(i, j) != 0 && graph.getEdge(j, i) != 0) {
return false;
}
}
}
return true;
}
По сути, мы проверяем, не удовлетворяют ли какие-либо пары условию.