LeetCode785解——判断二分图

LeetCode785解——判断二分图_第1张图片LeetCode785解——判断二分图_第2张图片
LeetCode785解——判断二分图_第3张图片
这道题博主在最开始做的时候,看了半天,愣是没弄懂输出数据的意思,博主开始以为给的是边,后来发现跟图对应不上,就懵逼了,后来是通过研究论坛上大神们的解法,才总算搞懂了题目的意思,原来输入数组中的 graph[i],表示顶点i所有相邻的顶点,比如对于例子1来说,顶点0和顶点1,3相连,顶点1和顶点0,2相连,顶点2和结点1,3相连,顶点3和顶点0,2相连。这道题让我们验证给定的图是否是二分图,所谓二分图,就是可以将图中的所有顶点分成两个不相交的集合,使得同一个集合的顶点不相连。为了验证是否有这样的两个不相交的集合存在,我们采用一种很机智的染色法,大体上的思路是要将相连的两个顶点染成不同的颜色,一旦在染的过程中发现有两连的两个顶点已经被染成相同的颜色,说明不是二分图。这里我们使用两种颜色,分别用1和 0 来表示,初始时每个顶点用-1表示未染色,然后遍历每一个顶点,如果该顶点未被访问过,则调用递归函数,如果返回 false,那么说明不是二分图,则直接返回 false。如果循环退出后没有返回 false,则返回 true。在递归函数中,如果当前顶点已经染色,如果该顶点的颜色和将要染的颜色相同,则返回 true,否则返回 false。如果没被染色,则将当前顶点染色,然后再遍历与该顶点相连的所有的顶点,调用递归函数,如果返回 false 了,则当前递归函数的返回 false,循环结束返回 true.

测试代码如下:

import java.util.Arrays;

class Solution{
	public static boolean isBipartitle(){
	int[][] graph = {{1,3},{0,2},{1,3},{0,2}}; //二分图集合
	int m = graph.length;  
	int[] colors = new int[m];
	Arrays.fill(colors, -1);  //先定义一个color变量,然后全部都加入-1
	for (int i=0; i<m; i++){
		if(colors[i] == -1 && !isBipartitle(i, 0, colors, graph)){
			return false;
		}
	}
	return true;
	}

	private static boolean isBipartitle(int curNode, int curColor, int[] colors, int[][] graph){
		if (colors[curNode] != -1){
			return colors[curNode] == curColor;
		}
		colors[curNode] = curColor;
		for (int nextNode : graph[curNode]){
			if(!isBipartitle(nextNode, 1- curColor , colors, graph)){
				return false;
			}
		}
		return true;
	}
	
	public static void main(String[] args){
		boolean a = isBipartitle();
		System.out.println(a);
	}
}

提交代码:

class Solution {
    public boolean isBipartite(int[][] graph) {
        int m = graph.length;
        int[] colors = new int[m];
        Arrays.fill(colors, -1);
        for (int i = 0; i < m; i++) { // 处理图不连通的情况
            if (colors[i] == -1 && !isBipartite(i, 0, colors, graph)) {
                return false;
            }
        }
        return true;
    }
    private boolean isBipartite(int curNode, int curColor, int[] colors, int[][] graph) {
        if (colors[curNode] != -1) {
            return colors[curNode] == curColor;
        }
        colors[curNode] = curColor;
        for (int nextNode : graph[curNode]) {
            if (!isBipartite(nextNode, 1 - curColor, colors, graph)) {
                return false;
            }
        }
        return true;
    }
}

你可能感兴趣的:(算法)