785. 判断二分图

785. 判断二分图

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:

原题链接:

785. 判断二分图

https://leetcode.cn/problems/is-graph-bipartite/description/

完成情况:

785. 判断二分图_第1张图片

解题思路:

 题目解释:
    每个节点都有一个编号 0~~~n-1
    然后一个graph[][] 二维数组,其中每个数组graph[u],代表按编号顺序过去的,里面的内容即为与当前对应编号所连接的边有哪些。

染色法 去解。

在算法中,“染色法” 通常指的是图论中的一种算法,用于解决图的染色问题,其中最经典的问题就是图的顶点着色问题。该问题的目标是为图的顶点分配颜色,使得任何相邻的顶点具有不同的颜色,同时最小化所使用的颜色数目。

这个问题在现实生活中有很多应用,例如在时间表设计中,课程或会议安排不同时需要同一时间和地点的资源,就可以使用图的染色方法来解决。

染色法有不同的变种和算法,其中一种基本的方法是贪心染色算法。贪心染色算法从一个顶点开始,为其分配一个颜色,然后遍历相邻的顶点,为每个相邻顶点分配一个颜色,但要确保分配的颜色与其相邻顶点的颜色不同。然后继续遍历未着色的顶点,为其分配颜色,并重复这个过程,直到所有顶点都被染色。

然而,贪心染色算法并不总能保证得到最少的颜色数。在一些情况下,可能需要使用更复杂的图染色算法,如回溯法、分支限界法等,来找到更优的染色方案。

总之,“染色法” 是解决图的顶点着色问题的一种算法,用于在满足相邻顶点颜色不同的条件下,找到尽可能少的颜色数目。

参考代码:

package 西湖算法题解___中等题;

public class __785判断二分图__染色法     {
	/**
	 题目解释:
	    每个节点都有一个编号 0~~~n-1
	    然后一个graph[][] 二维数组,其中每个数组graph[u],代表按编号顺序过去的,里面的内容即为与当前对应编号所连接的边有哪些。
	 */
	int color [];
	public boolean isBipartite(int[][] graph) {
		int nLength = graph.length;     //这是一个无向图
		color = new int[nLength];
		boolean flag = true;
		for (int i=0;i<nLength;i++){
			if (color[i] == 0){
				if (!dfs_isBipartite(i,1,graph)){
					flag = false;
				}
			}
		}
		return flag;
	}

	/**
	 *
	 * @param u
	 * @param c
	 * @param graph
	 * @return
	 */
	private boolean dfs_isBipartite(int u, int c, int[][] graph) {
		color[u]  = c;
		for (int i = 0;i<graph[u].length;i++){
			int node = graph[u][i];
			if (color[node] == 0) {
				if (!dfs_isBipartite(node, 3 - c, graph)) {
					return false;
				}
			} else {
					if (color[node] == c){
						return false;
					}
			}
		}
		return true;
	}
}

你可能感兴趣的:(算法知识,#,LeetCode题解,java学习,代理模式,java,算法,数据结构,leetcode)