zoukankan      html  css  js  c++  java
  • 785. Is Graph Bipartite?从两个集合中取点构图

    [抄题]:

    Given an undirected graph, return true if and only if it is bipartite.

    Recall that a graph is bipartite if we can split it's set of nodes into two independent subsets A and B such that every edge in the graph has one node in A and another node in B.

    The graph is given in the following form: graph[i] is a list of indexes j for which the edge between nodes i and j exists.  Each node is an integer between 0 and graph.length - 1.  There are no self edges or parallel edges: graph[i] does not contain i, and it doesn't contain any element twice.

    Example 1:
    Input: [[1,3], [0,2], [1,3], [0,2]]
    Output: true
    Explanation: 
    The graph looks like this:
    0----1
    |    |
    |    |
    3----2
    We can divide the vertices into two groups: {0, 2} and {1, 3}.
    
    Example 2:
    Input: [[1,2,3], [0,2], [0,1,3], [0,2]]
    Output: false
    Explanation: 
    The graph looks like this:
    0----1
    |   |
    |   |
    3----2
    We cannot find a way to divide the set of nodes into two independent subsets.
    

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    需要考虑非连通图的情况,此时无法染色 语言:

    !validColor(graph, colors, 0, i)

    [思维问题]:

    如果valid函数中有染色, 那主函数就不用再染 直接用valid函数即可

    [一句话思路]:

    双色问题的本质是BFS

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. 理解下:下一个节点是用其index i表示的

    [二刷]:

    1.  “已经染色”用color[i] != -1来表示,同时检查一下有没有染

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    如果valid函数中有染色, 那主函数就不用再染 直接用valid函数即可

    [复杂度]:Time complexity: O(n^2) Space complexity: O(n^2)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    初始化数组:

    Arrays.fill(nums, -1);

    [算法思想:递归/分治/贪心]:贪心

    [关键模板化代码]:

    public boolean validColor(int[][] graph, int[] colors, int color, int node) {
            //already colored,color again
            if (colors[node] != -1) return colors[node] == color;
            
            //color 1, then bfs
            colors[node] = color;
            for (int next : graph[node]) {
                if (!validColor(graph, colors, 1 - color, next)) return false;
            }
            
            return true;
        }

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

    class Solution {
        public boolean isBipartite(int[][] graph) {
            //cc: null
            if (graph == null || graph.length == 0) return false;
            
            //ini: colors[] -1
            int n = graph.length;
            int[] colors = new int[n];
            Arrays.fill(colors, -1);
            
            //for loop: not connected graph
            for (int i = 0; i < n; i++) {
                if (colors[i] == -1 && !validColor(graph, colors, 0, i)) return false;
            }
            
            return true;
        }
        
        public boolean validColor(int[][] graph, int[] colors, int color, int node) {
            //already colored,color again
            if (colors[node] != -1) return colors[node] == color;
            
            //color 1, then bfs
            colors[node] = color;
            for (int next : graph[node]) {
                if (!validColor(graph, colors, 1 - color, next)) return false;
            }
            
            return true;
        }
    }
    View Code
  • 相关阅读:
    铺地毯
    解方程
    引水入城
    10.16今日暂时停更博客
    聪明的质监员
    CCF NOI plus 201(7)6 初赛题 解题报告
    初赛可能会用到的计算机基础理论知识整理
    火柴排队
    借教室
    10.10今日暂时停更博客
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9050074.html
Copyright © 2011-2022 走看看