Registro de algoritmo
Tema de LeetCode:
Hay un gráfico no dirigido con n nodos en el gráfico. Cada uno de estos nodos tiene un número único entre 0 y n - 1. Se le proporciona un gráfico de matriz bidimensional, donde graph[u] es una matriz de nodos que consta de los nodos adyacentes del nodo u. Formalmente, para cada v en el gráfico[u], hay una arista no dirigida entre el nodo u y el nodo v.
Un grafo se llama grafo bipartito si es posible dividir el conjunto de nodos de un grafo en dos subconjuntos independientes A
y B
tal que cada arista del grafo tenga dos nodos del A
conjunto y uno del conjunto .B
ilustrar
1. El tema
输入:graph = [[1,2,3],[0,2],[0,1,3],[0,2]]
输出:false
解释:不能将节点分割成两个独立的子集,以使每条边都连通一个子集中的一个节点与另一个子集中的一个节点。
2. Análisis
- De acuerdo con el significado del gráfico bipartito en el título, necesitamos dividir los nodos dentro de todos los subgráficos en todo el conjunto de gráficos no dirigidos en dos categorías, y no hay bordes interconectados dentro de la misma categoría.
- Solo necesitamos recorrer los gráficos en orden, y marcar diferentes valores entre el nodo actual y el siguiente nodo adyacente, para dividir los dos nodos de datos clasificados.
- Debido a que puede haber muchos subgrafos, es necesario atravesar cada nodo como el nodo raíz.Si se ha marcado el nodo raíz, no hay necesidad de ir más allá, ahorrando tiempo.
- Durante el proceso transversal, es posible que se haya marcado un nodo, pero debido a la relación entre otros nodos, debe volver a marcarse. Si las dos categorías marcadas son diferentes, significa que el gráfico completo no se puede dividir en dos categorías, y puede fallar rápidamente Está marcado por un valor de estado.
class Solution {
private boolean isRight = true;
public boolean isBipartite(int[][] graph) {
int[] color = new int[graph.length];
for(int i = 0; i < graph.length && isRight; i++) {
if(color[i] != 0) continue;
isBipartite(color, graph, 1, i);
}
return isRight;
}
private void isBipartite(int[] color, int[][] graph, int c, int start) {
color[start] = c;
for(int temp : graph[start]) {
if(color[temp] == 0) {
isBipartite(color, graph, -c, temp);
if(!isRight) return;
} else if(color[temp] != -c) {
isRight = false;
return;
}
}
}
}
Resumir
Recorrido profundo de múltiples gráficos y conceptos de clasificación.