其他分享
首页 > 其他分享> > Is Graph Bipartite?

Is Graph Bipartite?

作者:互联网

Code link: https://leetcode.com/problems/is-graph-bipartite/

Constraint:

    graph.length == n
    1 <= n <= 100
    0 <= graph[u].length < n
    0 <= graph[u][i] <= n - 1
    graph[u] does not contain u.
    All the values of graph[u] are unique.
    If graph[u] contains v, then graph[v] contains u.

Idea

The idea is to use 2 different colors to mark each node. If there's an edge between u and v, then the color of u and v must be different. Otherwise there's a color conflict and it couldn't be a Bipartite graph. We could use BFS/DFS to traverse the graph. Initially set the node being visited as blue. Then when visiting its neighbors, set them as different color (red). If any of the neighbor already has a color set that is conflicting with current node, the graph is not a Bipartie.

Code

// A node could have 3 stages: 0 (unvisited), 1(red), -1 (blue). All nodes do not have any color at the begining. 
class Solution {
    public boolean isBipartite(int[][] graph) {
        int[] color = new int[graph.length];
        for (int u = 0; u < graph.length; u++) {
            if (color[u] != 0) {
                continue;
            }
            
            color[u] = 1;
            Queue<Integer> queue = new LinkedList<>();
            queue.offer(u);
            while (!queue.isEmpty()) {
                int cur = queue.poll();
                for (int neighbor : graph[cur]) {
                    if (color[cur] == color[neighbor]) {
                        return false;
                    } else if (color[neighbor] == 0) {
                        color[neighbor] = -color[cur];
                        queue.offer(neighbor);
                    }
                }
            }
        }
        
        return true;
    }
}
class Solution {
   public boolean isBipartite(int[][] graph) {
       int[] nodeColor = new int[graph.length];
       for (int i = 0; i < graph.length; i++) {
           if (nodeColor[i] == 0 && !isValid(graph, nodeColor, i, 1)) {
               return false;
           }
       }
       
       return true;
   }
   
   private boolean isValid(int[][] graph, int[] nodeColor, int node, int colorToMark) {
       if (nodeColor[node] != 0) {
           return nodeColor[node] == colorToMark;
       }
       
       nodeColor[node] = colorToMark;
       for (int neighbor : graph[node]) {
           if (!isValid(graph, nodeColor, neighbor, -colorToMark)) {
               return false;
           }
       }
       
       return true;
   }
}

标签:node,int,Graph,nodeColor,color,neighbor,graph,Bipartite
来源: https://www.cnblogs.com/blackraven25/p/15088217.html