[LeetCode] 785. Is Graph Bipartite?

题:https://leetcode.com/problems/is-graph-bipartite/description/

题目

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.

Note:

  • graph will have length in range [1, 100].
  • graph[i] will contain integers in range [0, graph.length - 1].
  • graph[i] will not contain i or duplicate values.
  • The graph is undirected: if any element j is in graph[i], then i will be in graph[j].

题目大意

判断图是否是 二分图。graph[i][j] ,i点与j点连接。

思路

染色法。

对每个未染色的点,对其相邻的点染色。
为染色的点 置为-1,遍历所有点,若该点未染色。
起始点染色为0,相邻点染色为1,再相邻的染色为0,以此循环下去。若遇到相邻的点已染色,但染色不符合预期 则返回 false。
若所有点均已染色,则返回true。

DFS 遍历相邻点

class Solution {
    public boolean isBipartite(int[][] graph) {
        int[] colors = new int[graph.length];
        Arrays.fill(colors,-1);
        for(int i = 0 ;i < graph.length; i++)
            if(colors[i]==-1 && !isPartBipartite(i,0,colors,graph))
                return false;
        return true;
    }
    public boolean isPartBipartite(int curNode,int curColor,int [] colors,int [][]graph){
        if(colors[curNode] != -1)   return colors[curNode] == curColor;
        colors[curNode] = curColor;
        for(int j = 0 ; j < graph[curNode].length;j++)
            if(!isPartBipartite(graph[curNode][j],1-curColor,colors,graph))
                return false;
        return true;
    }
}

BFS 遍历相邻点

class Solution {
    public boolean isBipartite(int[][] graph) {
        int[] colors = new int[graph.length];
        Arrays.fill(colors,-1);
        Queue<Integer> queue = new LinkedList<>();
        for(int i = 0 ;i < graph.length; i++)
            if(colors[i]==-1){
                queue.offer(i);
                int curColor = 0;
                while(!queue.isEmpty()){
                    int queueSize = queue.size();
                    for(int j = 0 ; j < queueSize ; j++){
                        int curNode = queue.poll();
                        if(colors[curNode]!=-1){
                            if(colors[curNode] != curColor) 
                                 return false;
                            continue;
                        }
                        colors[curNode] = curColor;
                        for(int k = 0 ;k < graph[curNode].length;k++)
                            queue.offer(graph[curNode][k]);
                    }
                    curColor = 1- curColor;
                }
            }
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/u013383813/article/details/83118984