2020年7月16日 判断二分图 isBipartite
默认格式:
class Solution {
public boolean isBipartite(int[][] graph) {
}
}
解题思路:
这道题比较抽象,我们先尽可能多地挖掘信息。
graph[i]表示的是和i相连的点的值。
比如题中的graph[0]={1,2,3}表示0和1,2,3相连
所有的数都是连续的,并且不会出现重复。
问题1:
什么叫做分割为两个独立的子集。也就是所谓的二分图。
特点有以下两点。
每一条边的两端,分别在两个独立的子集中,子集中存的是部分的节点的集合,两个子集加起来就是所有节点的集合。
也许这么说会比较清楚:
我们先看示例1:
通过graph[0]={1,3}我们知道,0和3有一条边,0和1也有一条边,所以我们可以确定0和1、3不是在同一个子集中。
继续看graph[1]={0,2},我们知道了1和0不在同一个子集中,同时,1和2也不在同一个子集中,所以,目前我们可以知道1和3在同一个子集中,0和2在一个子集中,不过这还没完,因为我们没有遍历完所有的节点,我们需要遍历所有节点,确定后面不会出现矛盾的选项才可以(实际上不需要,如果2或者3和其他节点有相连,比如2和0有相连,那么在0中就必定存在2,而0的连接点没有2,所有可以推出2和0不相连)
然后看一个示例2:
通过graph[0]={1,2,3}我们知道,0和1,2,3都是相连的,所以,如果要分子集,只能是{0},{1,2,3},但是看第二个,graph[1]={0,2}我们又发现1和2也是相连的,所以1和2不能在同一个子集中,这样和之前的结论就产生矛盾了,说明这不是一个二分图。