785. Is Graph Bipartite?( 判断是否为二分图)
Posted shaer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了785. Is Graph Bipartite?( 判断是否为二分图)相关的知识,希望对你有一定的参考价值。
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.
说明:1、输入数组中的graph[i],表示顶点i所有相邻的顶点,比如对于例子1来说,顶点0和顶点1,3相连,顶点1和顶点0,2相连,顶点2和结点1,3相连,顶点3和顶点0,2相连。
方法一:bfs
class Solution public static boolean isBipartite(int[][] graph) if(graph.length<=1) return true; int color[]=new int[graph.length]; for(int i=0;i<graph.length;i++) if(color[i]==0) color[i]=1; Queue<Integer> queue=new LinkedList<Integer>(); queue.offer(i); while(queue.size()>0) int t1=queue.poll(); for(int j=0;j<graph[t1].length;j++) int t2=graph[t1][j]; if(color[t2]==0) color[t2]=color[t1]==1?2:1; queue.offer(t2); else if(color[t1]==color[t2]) return false; return true;
方法二:dfs
class Solution private boolean flag=true; public boolean isBipartite(int[][] graph) if(graph.length<=1) return true; int [] color=new int[graph.length]; for(int i=0;i<graph.length;i++) if(color[i]==0) color[i]=1; dfs(i,graph,color); if(!flag) return flag; return true; void dfs(int pos,int[][] graph,int[] color) for(int j=0;j<graph[pos].length;j++) int k=graph[pos][j]; if(color[k]==0) color[k]=color[pos]==1?2:1; dfs(k,graph,color); else if(color[k]==color[pos]) flag=false; return;
以上是关于785. Is Graph Bipartite?( 判断是否为二分图)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 785. Is Graph Bipartite?
785. Is Graph Bipartite?( 判断是否为二分图)
LeetCode - 785. Is Graph Bipartite?
785. Is Graph Bipartite?从两个集合中取点构图