LeetCode785. Gráfico bipartito de sentencia

tema

Dado un gráfico de gráfico no dirigido, devuelve verdadero cuando el gráfico es un gráfico bipartito.

Si podemos dividir el conjunto de nodos en un gráfico en dos subconjuntos independientes A y B, y hacer que los dos nodos de cada borde en el gráfico sean uno del conjunto A y otro del conjunto B, llamamos a este gráfico imagen binaria.

El gráfico se dará como una lista de adyacencia, el gráfico [i] representa todos los nodos conectados al nodo i en el gráfico. Cada nodo es un número entero entre 0 y graph.length-1. No hay bucles propios ni aristas paralelas en este gráfico: i no existe en el gráfico [i] y no hay valores duplicados en el gráfico [i]. enlace

Ideas

No entendí la pregunta al principio. . Su lista de adyacencia es un poco interesante, hay un total graph.lengthde nodos y cada subíndice representa un nodo, es decir [0,graph.length-1], graph[i]una matriz, que almacena 节点ielementos con bordes entre y. No hay idea. Después de leer la solución, se puede resolver el método de teñido. Puede usar dfs o bfs.

class Solution {
    
    
    final static int RED = 1;
    final static int GREEN = 2; 
    int [] colors;
	/*bfs*/
    public boolean isBipartite(int[][] graph) {
    
    
        int num = graph.length;
        colors = new int[num];
        //从第一个节点开始
        for(int i = 0; i < num; i++){
    
    
            //遇到未染色的节点才开始bfs搜索
            if(colors[i] == 0){
    
    
                //未染色的都染为红色
                colors[i] = RED;
                Queue<Integer> queue = new LinkedList<>();
                //从i开始bfs
                queue.offer(i);
                while(!queue.isEmpty()){
    
    
                    int curNode = queue.poll();
                    int color = colors[curNode];
                    //对其邻居进行染色
                    for(int neighbor: graph[curNode]){
    
    
                        //邻居未染色color为0,需要染上与curNode不同的颜色
                        if(colors[neighbor] == 0){
    
    
                            colors[neighbor] = color == RED ? GREEN : RED;
                            queue.offer(neighbor);
                        }//邻居染色了,若与curNode颜色相同直接返回
                        else if(colors[neighbor] == color){
    
    
                            return false;
                        }
                    }
                }
            }
        }
        return true;
    }
}
class Solution {
    
    
    final static int RED = 1;
    final static int GREEN = 2; 
    int [] colors;
    boolean valid = true; 
    /*dfs*/
    public boolean isBipartite(int[][] graph) {
    
    
        int num = graph.length;
        colors = new int[num];
        for(int i = 0; i < num; i++){
    
    
            if(colors[i] == 0){
    
    
                dfs(graph, i, RED);
            }
        }
        return valid;
    }

    void dfs(int[][] graph, int curNode, int color){
    
    
        if(!valid){
    
    
            return;
        }
        colors[curNode] = color;
        int neighborColor = color == RED ? GREEN : RED;
        for(int neighbor: graph[curNode]){
    
    
            if(colors[neighbor] == 0){
    
    
                dfs(graph, neighbor, neighborColor);
            }else if(colors[neighbor] != neighborColor){
    
    
                valid = false;
                return;
            }
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_42007742/article/details/107378819
Recomendado
Clasificación