이분 도 판단 (염색, DFS)

이분 도 판단 (염색, DFS)
     
       graph,           true。

                        A B,                  A  ,    B  ,            。

graph          ,graph[i]       i       。         0 graph.length-1     。           : graph[i]     i,  graph[i]       。


   1:
  : [[1,3], [0,2], [1,3], [0,2]]
  : true
  : 
     :
0----1
|    |
|    |
3----2
           : {0, 2}   {1, 3}。

   2:
  : [[1,2,3], [0,2], [0,1,3], [0,2]]
  : false
  : 
     :
0----1
| \  |
|  \ |
3----2
                 。
  :

graph        [1, 100]。
graph[i]          [0, graph.length - 1]。
graph[i]      i        。
     :   j   graph[i]  ,    i     graph[j]  。

코드
class Solution {
    //        ,   :  、     
    private static final int UNCOLORED = 0;
    private static final int RED = 1;
    private static final int GREEN = 2;
    //        
    private int[] color;
    //       
    private boolean valid = true;
    public boolean isBipartite(int[][] graph) {
        //     
        int n = graph.length;
        color = new int[n];
        for (int i = 0; i < n; i++) {
            //            ,                      
            if (color[i] == UNCOLORED) {
                dfs(i, RED, graph);
            }
        }
        return valid;
    }

    private void dfs(int node, int c, int[][] graph) {
        color[node] = c;
        //                   
        int nc = c == RED ? GREEN : RED;
        //            
        for (int neighbor : graph[node]) {
            //          ,           
            if (color[neighbor] == UNCOLORED) {
                dfs(neighbor, nc, graph);
                //                
                if (!valid) {
                    return;
                }
            //           ,                ,       
            } else if (color[neighbor] != nc) {
                valid = false;
                return;
            }
        }
    }
}

좋은 웹페이지 즐겨찾기