785:判断二分图

This commit is contained in:
huangge1199 2021-08-02 13:35:23 +08:00
parent 5898bf9e3d
commit 7392c57aa9
2 changed files with 146 additions and 0 deletions

View File

@ -0,0 +1,104 @@
//存在一个 无向图 图中有 n 个节点其中每个节点都有一个介于 0 n - 1 之间的唯一编号给你一个二维数组 graph 其中 graph[u]
// 是一个节点数组由节点 u 的邻接节点组成形式上对于 graph[u] 中的每个 v 都存在一条位于节点 u 和节点 v 之间的无向边该无向图同时具有
//以下属性
//
// 不存在自环graph[u] 不包含 u
// 不存在平行边graph[u] 不包含重复值
// 如果 v graph[u] 那么 u 也应该在 graph[v] 该图是无向图
// 这个图可能不是连通图也就是说两个节点 u v 之间可能不存在一条连通彼此的路径
//
//
// 二分图 定义如果能将一个图的节点集合分割成两个独立的子集 A B 并使图中的每一条边的两个节点一个来自 A 集合一个来自 B 集合就将这个图称
// 二分图
//
// 如果图是二分图返回 true 否则返回 false
//
//
//
// 示例 1
//
//
//输入graph = [[1,2,3],[0,2],[0,1,3],[0,2]]
//输出false
//解释不能将节点分割成两个独立的子集以使每条边都连通一个子集中的一个节点与另一个子集中的一个节点
//
// 示例 2
//
//
//输入graph = [[1,3],[0,2],[1,3],[0,2]]
//输出true
//解释可以将节点分成两组: {0, 2} {1, 3}
//
//
//
// 提示
//
//
// graph.length == n
// 1 <= n <= 100
// 0 <= graph[u].length < n
// 0 <= graph[u][i] <= n - 1
// graph[u] 不会包含 u
// graph[u] 的所有值 互不相同
// 如果 graph[u] 包含 v那么 graph[v] 也会包含 u
//
// Related Topics 深度优先搜索 广度优先搜索 并查集
// 👍 283 👎 0
package leetcode.editor.cn;
import com.code.leet.entiy.TwoArray;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
//785:判断二分图
public class IsGraphBipartite {
public static void main(String[] args) {
//测试代码
Solution solution = new IsGraphBipartite().new Solution();
// TwoArray twoArray = new TwoArray("[[1,3],[0,2],[1,3],[0,2]]");
System.out.println("-------------------------------");
TwoArray twoArray = new TwoArray("[[],[2,4,6],[1,4,8,9],[7,8],[1,2,8,9],[6,9],[1,5,7,8,9],[3,6,9],[2,3,4,6,9],[2,4,5,6,7,8]]",false);
System.out.println(solution.isBipartite(twoArray.getArr()));
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public boolean isBipartite(int[][] graph) {
int max = graph.length;
int[] use = new int[max];
Arrays.fill(use, -1);
for (int k = 0; k < graph.length; k++) {
if (use[k] > -1) {
continue;
}
use[k] = 0;
Queue<Integer> queue = new LinkedList<>();
queue.add(k);
while (!queue.isEmpty()) {
int size = queue.size();
for (int j = 0; j < size; j++) {
int num = queue.poll();
int cur = 1 - use[num];
for (int i = 0; i < graph[num].length; i++) {
int curNum = graph[num][i];
if (use[curNum] == use[num]) {
return false;
}
if (use[curNum] == -1) {
use[curNum] = cur;
queue.add(curNum);
}
}
}
}
}
return true;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,42 @@
存在一个 <strong>无向图</strong> ,图中有 <code>n</code> 个节点。其中每个节点都有一个介于 <code>0</code><code>n - 1</code> 之间的唯一编号。给你一个二维数组 <code>graph</code> ,其中 <code>graph[u]</code> 是一个节点数组,由节点 <code>u</code> 的邻接节点组成。形式上,对于 <code>graph[u]</code> 中的每个 <code>v</code> ,都存在一条位于节点 <code>u</code> 和节点 <code>v</code> 之间的无向边。该无向图同时具有以下属性:
<ul>
<li>不存在自环(<code>graph[u]</code> 不包含 <code>u</code>)。</li>
<li>不存在平行边(<code>graph[u]</code> 不包含重复值)。</li>
<li>如果 <code>v</code><code>graph[u]</code> 内,那么 <code>u</code> 也应该在 <code>graph[v]</code> 内(该图是无向图)</li>
<li>这个图可能不是连通图,也就是说两个节点 <code>u</code><code>v</code> 之间可能不存在一条连通彼此的路径。</li>
</ul>
<p><strong>二分图</strong> 定义:如果能将一个图的节点集合分割成两个独立的子集 <code>A</code><code>B</code> ,并使图中的每一条边的两个节点一个来自 <code>A</code> 集合,一个来自 <code>B</code> 集合,就将这个图称为 <strong>二分图</strong></p>
<p>如果图是二分图,返回 <code>true</code><em> </em>;否则,返回 <code>false</code></p>
<p> </p>
<p><strong>示例 1</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2020/10/21/bi2.jpg" style="width: 222px; height: 222px;" />
<pre>
<strong>输入:</strong>graph = [[1,2,3],[0,2],[0,1,3],[0,2]]
<strong>输出:</strong>false
<strong>解释:</strong><code>不能将节点分割成两个独立的子集,</code>以使每条边都连通一个子集中的一个节点与另一个子集中的一个节点。</pre>
<p><strong>示例 2</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2020/10/21/bi1.jpg" style="width: 222px; height: 222px;" />
<pre>
<strong>输入:</strong>graph = [[1,3],[0,2],[1,3],[0,2]]
<strong>输出:</strong>true
<strong>解释:</strong><code>可以将节点分成两组: {0, 2} 和 {1, 3} 。</code></pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>graph.length == n</code></li>
<li><code>1 <= n <= 100</code></li>
<li><code>0 <= graph[u].length < n</code></li>
<li><code>0 <= graph[u][i] <= n - 1</code></li>
<li><code>graph[u]</code> 不会包含 <code>u</code></li>
<li><code>graph[u]</code> 的所有值 <strong>互不相同</strong></li>
<li>如果 <code>graph[u]</code> 包含 <code>v</code>,那么 <code>graph[v]</code> 也会包含 <code>u</code></li>
</ul>
<div><div>Related Topics</div><div><li>深度优先搜索</li><li>广度优先搜索</li><li>并查集</li><li></li></div></div>\n<div><li>👍 283</li><li>👎 0</li></div>