题目描述
Given a
graph
, returntrue
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 indexesj
for which the edge between nodesi
andj
exists. Each node is an integer between0
andgraph.length - 1
. There are no self edges or parallel edges:graph[i]
does not containi
, and it doesn’t contain any element twice.
即判断给定的图是否是二分图:
设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A, j in B),则称图G为一个二分图。
算法分析
二分图的判断可以看作染色问题。对于图中的每一个顶点S
,与它直接相邻的任一顶点N
,其颜色必然与S
不同,则这样的图是一个二分图。
最常用也最简单的方法就是遍历(DFS或BFS)整张图,用两种不同的颜色A
和B
,对每个顶点染色。选定一个顶点S
开始,对其进行染色,再访问它的邻居顶点N
。若:
N
还未被染色,即对它染色与S
不同的颜色,并继续访问S
的邻居顶点。N
已被染色,且其颜色与S
相同,则该图不是一个二分图。N
已被染色,但其颜色与S
不同,则继续查看和访问其它邻居节点。
访问了所有的顶点后(即完成对所有顶点的染色),该图就是一个二分图。
代码实现
1 | class Solution { |
需要注意的是,题目输入的图不一定是一个连通图,因此,使用DFS或BFS遍历时要注意判断是否已经访问了所有的顶点。
本文为博主原创文章,转载请注明出处。